以下两个代码段中的哪一个更快,为什么?

时间:2012-11-13 17:16:38

标签: php performance

我和Jim O'Brien制作了两段代码,完全相同。但哪个更快?

(代码生成输入数组的偶数和奇数的键值对。如果输入数组是这样的:

Array(
    "thirteen",
    13,
    "seven",
    7,
    ...
)

然后输出数组将变为:

Array(
    "thirteen" => 13,
    "seven" => 7,
    ...
)

代码段1:

<?php

$output = array();
for ($i = 0; $i < count($input); $i++) {
    $output[$input[$i]] = $input[++$i];
}

?>

代码段2:

<?php

$output = array();
for ($i = 0; $i < count($input); $i += 2) {
    $output[$input[$i]] = $input[$i + 1];
}

?>

哪个代码段更快,为什么?

4 个答案:

答案 0 :(得分:7)

如果你预先计算count($input)而不是每次循环时都运行它,那么它们之间的差异是无关紧要的。

在你给出的两个之间,第二个更具可读性,是我选择的那个。效率方面,它不值得打扰。

答案 1 :(得分:3)

这通常被称为微优化。这不值得担心,因为两者之间的任何收益/差异最多都可以忽略不计。您应该专注于可读性并遵循良好的编码实践,而不是担心这样的事情。另外,正如Kolink在上面指出的那样,你可以在进入循环之前得到count()的结果,这样你就不会在每次迭代时运行不必要的函数调用:

<?php

$output = array();
$count = count($input);
for ($i = 0; $i < $count; $i++) {
    $output[$input[$i]] = $input[++$i];
}

?>

答案 2 :(得分:1)

如果PHP将其编译为汇编指令,它可能会将它们优化为一组x86指令(假设您正在对该架构进行基准测试),这些指令需要相同的CPU周期数。

那说:

  • 有一个x86指令可以将值增加/减少一个。这些可能会用于两个片段的内部循环命令(即++$i$i + 1)。
  • 在第二个代码段中,计算结果$i + 1将在使用后被丢弃,而
  • 第一个片段会保留它。我只能推测生成的指令是否会将其写回内存(速度很慢)或将其保存在CPU寄存器中(这会很快)。
  • 关于循环的开头,再一个片段将受益于增加指令,而片段2需要添加指令。在现代CPU上,两者通常只需要一个CPU周期。因此,如果第二个片段在内部循环中计算出的结果未使用,则无关紧要。

在任何情况下,您只能在拍摄大量样本时测量差异。如果您真的想知道,您需要一种方法来查看PHP编译器生成的生成指令。由于代码相当小,因此通过每个代码段生成的指令来识别循环和计算CPU周期应该不会太难(有关如何查找每条指令的循环次数的信息,请参阅this question)。

答案 3 :(得分:0)

差异可以忽略不计,请选择最易读的选项。