今天在知乎看到一个问题同为动态语言,Python 的性能为何只有 PHP 的五分之一?,本来对于打嘴仗没有兴趣,无意中看到了一段代码,是一个while循环,改动后执行速度竟然从453ms减少到了97ms,代码如下:
1 | <?php |
改动后的代码如下:
1 | <?php |
差别只有while部分,一个是自增,一个是自减,按道理自增和自减本身并不会有速度上的差别,那只能是while执行的次数原因了
- 首先加一个标志$counter,while每运行一次就加1,然后查看两段代码分别计算10以内的素数的while执行次数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#第一段代码
$counter = 0;
while ($count > 1) {
$counter++;
if ($num % $count == 0) {
echo $counter . 's';
return false;
}
echo $counter . 's';
$count-- ;
}
#第二段代码
$counter = 0;
$i = 2;
while ($i <= $count) {
$counter++;
if ($num % $i == 0) {
echo $counter . 's';
return false;
}
echo $counter . 's';
$i++ ;
}
执行结果如下:
正如我预料的那样,第一段代码明显运行次数较多,以18的素数来说,第一段代码执行了1次,而第二段代码执行了2次。
稍微想一下就知道了原因,18的平方根取整是4。
按照代码最多执行3次,而18明显不是素数。
这就导致了在第一段代码执行了4、3的时候发现了18不是素数,第二段代码执行到2的时候就发现了。
顺便提一句,编程语言只是工具。