【问题标题】:Which of the followings is more efficient?以下哪个更有效?
【发布时间】:2015-12-27 23:35:12
【问题描述】:

假设我有以下设置数组:

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

就速度和内存使用而言,以下哪组代码更高效?

设置 1

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

第二组

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 倍。

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

【问题讨论】:

  • 可能是重复的,但与list()each() 混合使用会使比较情况更加复杂。
  • 为什么不为自己做基准测试
  • @Dagon 在半年后添加了基准测试结果...
  • 您的基准测试非常不言自明。问题是:您的应用程序的设置列表中是否有 100K 项?而且,如果您使用这种方法从它们中创建常量,您真的会在其余代码中使用它们吗?

标签: php


【解决方案1】:

一方面,foreach 需要担心traversable,所以在这种情况下,与while 中的each 相比,开销可能很小。

但另一方面,使用eachwhile 您正在使用两种两种语言结构和一种功能。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2010-10-10
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多