以下哪项更有效?

时间:2015-09-30 08:48:08

标签: php

假设我有以下设置数组:

$settings = array('a' => 1, 'b' => 2, 'c' => 3);

在速度和速度方面,以下哪一组代码更有效率?内存使用情况?

设置1

foreach($settings as $k => $v) {
    define($k, $v);
}

设置2

while (list($key, $value) = each($settings)) {
    define($key, $value);
}

他们有相同的结果。

更新:添加了基准测试结果

以下是基准代码:

<?php
header('Content-Type: text/plain');
$arr = array();
for($i = 0; $i < 100000; $i++) {
  $arr['rec_' . $i] = md5(time());
}

$start = microtime(true);

foreach ($arr as $k => $v) {
    define($k, $v);
}

$end = microtime(true);
echo 'Method 1 - Foreach: ' . round($end - $start, 2) . PHP_EOL;

$arr = array();
for($i = 0; $i < 100000; $i++) {
  $arr['rec2_' . $i] = md5(time());
}


$start = microtime(true);

while (list($key, $value) = each($arr)) {
  define($key, $value);
}

$end = microtime(true);
echo 'Method 2 - While List Each: ' . round($end - $start, 2) . PHP_EOL;
?>

经过不少基准测试后,我发现foreach()while-list-each方法快2到3倍。

希望上述基准对未来的观众有用。

1 个答案:

答案 0 :(得分:1)

一方面,foreach需要担心traversable,因此在这种情况下,each中的while可能会花费很少的开销。

但另一方面,使用eachwhile,您使用两种语言结构和一种函数。

Also你需要记住,在each完成后,如果迭代抛出所有元素,光标将位于数组的最后一个元素中。