PHP foreach && while&& for 性能比较
2018-04-09 12:11:09 小德 PHP 访问次数 448

PHP foreach遍历时没有操作数组本身 而是操作数组的一份拷贝;for循环在数组本身操作,而不是数组拷贝。

而while是通过移动数组内部指针进行。这个逻辑下foreach性能比while性能差,我们测试一下

$array = [];
$ret = [];
for($i =0;$i<1000;$i++) {
    $array[$i] = $i;
}

$begin = microtime(true);
foreach ($array as  $value) {
    $ret[] = $value;
}
$end = microtime(true);
$t = ($end - $begin) * 1000;
var_dump($t);

for($i =0;$i<1000;$i++) {
    $array[$i] = $i;
}
$b = microtime(true);
for($i = 0;$i<count($array);$i++) {
    $ret[] = $array[$i];
}
$e = microtime(true);
$t = ($e - $b) * 1000;
var_dump($t);

for($i =0;$i<1000;$i++) {
    $array[$i] = $i;
}
$b = microtime(true);
while (list($i) = each($array)) {
    $ret[] = $array[$i];
}
$e = microtime(true);
$t = ($e - $b) * 1000;
var_dump($t);exit;

output:

image.png

结果恰恰相反?怎么回事。。这涉及PHP的内存管理机制,写时复制,仅仅是读数据的时候foreach 仍然是通过引用读取数据,仅仅当涉及修改时foreach才会真正复制。

 对于写操作,我们test一下。

$array = [];
$ret = [];
for($i =0;$i<1000;$i++) {
    $array[$i] = $i;
}

$begin = microtime(true);
foreach ($array as  $value) {
    $ret[] = $value;
}
$end = microtime(true);
$t = ($end - $begin) * 1000;
var_dump($t);

for($i =0;$i<1000;$i++) {
    $array[$i] = $i;
}
$b = microtime(true);
for($i = 0;$i<count($array);$i++) {
    $ret[] = $array[$i];
}
$e = microtime(true);
$t = ($e - $b) * 1000;
var_dump($t);

for($i =0;$i<1000;$i++) {
    $array[$i] = $i;
}
$b = microtime(true);
while (list($i) = each($array)) {
    $ret[] = $array[$i];
}
$e = microtime(true);
$t = ($e - $b) * 1000;
var_dump($t);exit;

output

image.png

foreach的效率仍然比for和while快很多。for和while 不太稳定,单效率差别不大。理论上while用于数组写操作的时候,不会产生数组拷贝,处理大数组时节约内存会比较有用。(PHP编程第三版page135)