0

私とJim O'Brienは、まったく同じことを行う 2 つのコード スニペットを作成しました。しかし、どちらが速いですか?

(コードは、入力配列の偶数と奇数のキーと値のペアを作成します。入力配列が次の場合:

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)それらの違いは、ループが発生するたびに実行する代わりに事前に計算した場合に節約されるものと比較して、重要ではありません。

あなたが与えた2つの間で、2番目の方が読みやすく、私が選ぶものです。効率的に考えると、気にする価値はありません。

于 2012-11-13T17:19:06.977 に答える
3

これは通常、マイクロ最適化と呼ばれます。2つの間の利益/違いはせいぜい無視できるため、心配する価値はありません. このようなことを心配する代わりに、読みやすさと適切なコーディング プラクティスに従うことに集中する必要があります。また、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 がこれをアセンブリ命令にコンパイルすると、おそらく同じ数の CPU サイクルを使用する一連の x86 命令 (そのアーキテクチャのベンチマークを行っていると仮定) に最適化されます。

それは言った:

  • 値を 1 ずつ増減する x86 命令があります。これらはおそらく両方のスニペットの内部ループ コマンド (つまり++$i$i + 1) に使用されます。
  • 2 番目のスニペットでは、計算結果$i + 1は使用後に破棄されますが、
  • 最初のスニペットはそれを保持します。生成された命令がそれをメモリに書き戻す (遅い) か、CPU レジスタに保持する (速い) かを推測することしかできません。
  • ループの先頭に関しては、スニペット 1 は増加命令の恩恵を受けますが、スニペット 2 には追加命令が必要です。最新の CPU では、どちらも通常 1 CPU サイクルしかかかりません。したがって、2 番目のスニペットが内側のループで計算された結果を未使用のままにしておいても、実際には問題になりません。

いずれにせよ、非常に多数のサンプルを取得した場合にのみ違いを測定できます。本当に知りたい場合は、PHP コンパイラーが生成する命令を確認する方法が必要です。コードはかなり小さいので、ループを特定し、各スニペットが生成する命令によって CPU サイクルをカウントすることはそれほど難しくありません (命令ごとのサイクル数を見つける方法については、この質問を参照してください)。

于 2012-11-13T17:35:28.440 に答える
0

違いはごくわずかです。最も読みやすいオプションを選択してください。

于 2012-11-13T17:23:11.200 に答える