0

我和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

4 回答 4

7

与预先计算count($input)而不是每次循环出现时都运行它相比,它们之间的差异是微不足道的。

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

于 2012-11-13T17:19:06.977 回答
3

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

<?php

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

?>
于 2012-11-13T17:21:35.590 回答
1

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

那说:

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

In any case, you will only be able to measure a difference when taking a very large number of samples. If you really want to know, you would need a way to look at the generated instructions the PHP compiler produces. As the code is rather small, it shouldn't be too hard to identify the loops and count the CPU cycles by the instructions each snippet produces (see this question for information on how to find the number of cycles per instruction).

于 2012-11-13T17:35:28.440 回答
0

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

于 2012-11-13T17:23:11.200 回答