PHP:For vs. Foreach

时间:2014-01-03 11:02:34

标签: php for-loop foreach

简介

如果我在PHP中循环,并知道我想要迭代多少次,我通常会像这样使用for循环:

for($y=0; $y<10; $y++) {
    // ...
}

但是最近我看到有人使用了foreach循环:

foreach (range(1, 10) as $y) {
    // ...
}

现在,我发现foreach-loop更具可读性,并考虑采用这种foreach-construct。但另一方面,for循环更快,如下所示。

速度测试

我做了一些速度测试,结果如下。

FOREACH:

$latimes = [];
for($x=0; $x<100; $x++) {

    $start = microtime(true);

    $lcc = 0;
    foreach (range(1, 10) as $y) {
        $lcc ++;
    }

    $latimes[$x] = microtime(true) - $start;
}
echo "Test 'foreach':\n";
echo (float) array_sum($latimes)/count($latimes);

我跑了五次之后的结果:

Test 'foreach': 2.2873878479004E-5
Test 'foreach': 2.2327899932861E-5
Test 'foreach': 2.9709339141846E-5
Test 'foreach': 2.5603771209717E-5
Test 'foreach': 2.2120475769043E-5

:用于:

$latimes = [];
for($x=0; $x<100; $x++) {

    $start = microtime(true);

    $lcc = 0;
    for($y=0; $y<10; $y++) {
        $lcc++;
    }

    $latimes[$x] = microtime(true) - $start;
}
echo "Test 'for':\n";
echo (float) array_sum($latimes)/count($latimes);

我跑了五次之后的结果:

Test 'for': 1.3396739959717E-5
Test 'for': 1.0268688201904E-5
Test 'for': 1.0945796966553E-5
Test 'for': 1.3313293457031E-5
Test 'for': 1.9807815551758E-5

问题

我想知道的是你喜欢什么,为什么?哪一个对您来说更具可读性,您是否更喜欢可读性而不是速度?

1 个答案:

答案 0 :(得分:0)

以下代码示例是在codeigniter框架的基准库下用php编写的(它只是为了节省我的时间,因为我目前正在使用这些:D),如果您使用其他语言,请将此视为您的语言的伪代码实现办法。对任何编程语言实现这一点应该没有任何问题。如果您有使用php / codeigniter的经验,那么您很幸运,只需复制粘贴此代码并测试:)。

$data = array();
for($i=0;$i<500000;$i++){
        $data[$i] = rand();
    }

$this->benchmark->mark('code_start');
    for($i=0;$i<500000;$i++){
        ;
    }
$this->benchmark->mark('code_end');
echo $this->benchmark->elapsed_time('code_start', 'code_end');
echo "<br/>";
$this->benchmark->mark('code_start');         
    foreach($data as $row){
        ;
    }
$this->benchmark->mark('code_end');

我在这两个循环之间有2秒的差异(一个后来一个跑了大约3秒,而第一个跑了大约5秒)。所以,foreach循环在这里赢得了“为vs foreach而战”。但是,你可能会想,我们不需要这么大的循环;可能并非在所有情况下,但在某些情况下可能需要长循环,例如从web服务/ xml / csv等更新大型产品数据库。而且,此示例仅向您了解它们之间的性能差异。 / p>

但是,是的,他们都有一些独家使用,他们应该完全因为极端的容易/优化。就像,如果你在循环中工作,在某种情况下循环可以终止。在这种情况下,for循环将以最大的灵活性完成工作。另一方面,如果您从列表数组中获取每个对象/项目并进行处理,在这种情况下,foreach将为您提供最佳服务。

相关问题