我和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];
}
?>
哪个代码段更快,为什么?
答案 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周期数。
那说:
++$i
和$i + 1
)。$i + 1
将在使用后被丢弃,而在任何情况下,您只能在拍摄大量样本时测量差异。如果您真的想知道,您需要一种方法来查看PHP编译器生成的生成指令。由于代码相当小,因此通过每个代码段生成的指令来识别循环和计算CPU周期应该不会太难(有关如何查找每条指令的循环次数的信息,请参阅this question)。
答案 3 :(得分:0)
差异可以忽略不计,请选择最易读的选项。