2009-04-19 15:49:42| 分类: PHP |字号 订阅
使用循环计算与公式计算的区别
—-连加问题分析
今天,无意中看到一道题:写一段代码,求1+2+3+……+100的结果。以前做过这样的题,不过,看到了就又想做一次。于是,就打开了编辑框,写下了以下代码:
<?php
for($i=1;$i<=100;$i++)
{
$sum+=$i;
}
echo "result:".$sum."<br/>";
?>
结果:
result:5050
Page executed in 0.0002 seconds.
这是一个小数目的计算,因为只循环了100次,所以分别不出程序的快与慢。但当数目很大的时候,例如我把100改成1000000或者更大的数以后呢?于是,我进行了以下测试(完整代码,包括测试时间的运算):
<?PHP
$starttimer = time()+microtime();
for($i=1;$i<=1000000;$i++)
{
$sum+=$i;
}
echo "result:".$sum."<br/>";
$stoptimer = time()+microtime();
$timer = round($stoptimer-$starttimer,4);
echo "Page executed in $timer seconds.";
?>
结果:
result:5.000005E+11
Page executed in 0.4228 seconds.
发现,执行的时间上到了0.4228秒。是否可以提高执行的速度呢?肯定可以,换一下方法就行了。所以,我再尝试了以下方法:
<?PHP
$starttimer = time()+microtime();
$i=100;
$sum=(1+$i)*$i/2;
echo "result:".$sum."<br/>";
$stoptimer = time()+microtime();
$timer = round($stoptimer-$starttimer,4);
echo "Page executed in $timer seconds.";
?>
结果:
result:5050
Page executed in 0.0001 seconds.
循环100次是这样,现在换大一点的数:
<?PHP
$starttimer = time()+microtime();
$i=10000000000;
$sum=(1+$i)*$i/2;
echo "result:".$sum."<br/>";
$stoptimer = time()+microtime();
$timer = round($stoptimer-$starttimer,4);
echo "Page executed in $timer seconds.";
?>
结果:
result:5.0000000005E+19
Page executed in 0.0002 seconds.
为什么执行大的数据时会有如此大的区别呢?因为for循环很费时间,而使用数学公式,它只需要运算一下,而不必循环,也就减少了代码运行的时间。
以上是双数的相加,如果位数是单数的话,公式如下:
$sum=(1+$i-1)*$i/2+$i;
如果首位不是1的情况,又是如何?请看:
$sum=($first+$last)*($last-$first+1)/2; //位数为双的
$sum=($first+$last-1)*($last-$first)/2+$last; //位数为单的