【问题标题】:is quicker to use array_keys() in a foreach statemnt or set a value variable that's never used?在 foreach 语句中使用 array_keys() 或设置一个从未使用过的值变量会更快吗?
【发布时间】:2012-01-11 15:39:37
【问题描述】:

假设我想遍历一个数组,或者我从不查看值,或者我在其中设置东西,所以我只想要键。哪个更快:

// Set a variable each iteration which is unused.
foreach ($array as $key => $value) {
  $array[$key]['foo'] = 'bar';
}

// Call array_keys() before iterating.
foreach (array_keys($array) as $key) {
  $array[$key]['foo'] = 'bar';
}

【问题讨论】:

  • @AshleyBanks:他为什么不呢?
  • 我也不确定他为什么不这样做 - 这就是为什么我问他会用这个做什么。
  • 真的需要几微秒吗?如果不是这种情况,请以您喜欢的方式编写代码,并且记住代码在做什么。着眼长远。
  • @AshleyBanks:为什么不呢?在很多情况下需要遍历数组,并且只有在特定的 foreach 循环中感兴趣的键。

标签: php performance


【解决方案1】:

我认为这也可以,而且可能更快:

foreach ($array as &$value) {
  $value['foo'] = 'bar';
}

更新:我做了一个小测试,这似乎更快。 http://codepad.org/WI7Mtp8K

【讨论】:

  • +1 表示优雅。虽然 PHP > 5.2 中没有隐含引用传递?
  • 它不是通过引用传递,而是在读取时避免复制。 foreach 创建数组元素的副本,但如果前面带有引用运算符 - 它不会这样做。因此,foreach 变得更快,PHP 使用更少的内存。
  • 记得在终止循环后取消设置($value)
  • @Rocket,很有趣。从以前开始,我一直都知道 foreach 循环存在 内存开销。现在我知道为什么以及如何避免它。谢谢。
  • 我看不出这个答案在这里有什么意义。这很有趣,但不适用于这个问题,因为这里你只有数组的值,而不是键。
【解决方案2】:

暂且不说第二个例子是人为的。这意味着,正如 Ashley Banks 所说,你为什么要这样做

第一个示例将是两者中性能更高的示例。第二个具有对array_keys() 的附加函数调用的开销。

查看PHP Benchmark 了解更多性能测试。如有疑问,请自行使用 microtime() 进行基准测试。

【讨论】:

    【解决方案3】:

    人们需要停止优先质疑 OP 的动机。

    我做了一个简单的微时间测试,几乎没有注意到执行时间有任何显着差异。

    方法——创建测试数组:

    $arr = array();
    for($i = 0; $i<10000; $i++){
        $arr[] = mt_rand(0, PHP_INT_MAX);
        //NOTE: I also tested setting values in random keys, no measurable difference
    }
    

    然后使用该数组进行测试:

    //Method 1
    $start = microtime(true);
    foreach(array_keys($arr) as $k){
        $arr[$k] = 0; //Do something
    }
    $end = microtime(true);
    echo 'we spent '.($end - $start).' seconds doing this.';
    

    这是其他方法测试的代码(单独运行,或者结果变化更大)

    //Method 2
    $start = microtime(true);
    foreach($arr as $k => $v){
        $arr[$k] = 0; //Do something
    }
    $end = microtime(true);
    echo 'we spent '.($end - $start).' seconds doing this.';
    

    我的时间都是大约 2 毫秒的运行时间。我想我的系统对于微秒的一致测量来说不够稳定。 我无法确定一个是否比另一个快。

    我还测试了使用较小的数组运行每个 foreach 1000 次以测量方法本身,但我只得到了相同的 2 毫秒结果。

    这是什么意思? 基于这些简单的测试,就性能而言,方法的选择是没有意义的。 如果您在极其稳定的系统上运行非常大的数组,或者以另一种方式运行非常多的 foreach 循环,也许您可​​以用一种方法测量出相对于另一种方法的微小改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      相关资源
      最近更新 更多