foreach、ラムダ付きarray_map、静的関数付きarray_mapのパフォーマンス 質問する

foreach、ラムダ付きarray_map、静的関数付きarray_mapのパフォーマンス 質問する

配列を別の配列に変換するために使用されるこれら 3 つのアプローチ間のパフォーマンスの違い (ある場合) は何ですか?

  1. 使用foreach
  2. array_mapラムダ/クロージャ関数の使用
  3. array_map「static」関数/メソッドを使用する
  4. 他のアプローチはありますか?

わかりやすくするために、すべて同じこと、つまり数値の配列を 10 倍にする例を見てみましょう。

$numbers = range(0, 1000);

フォア

$result = array();
foreach ($numbers as $number) {
    $result[] = $number * 10;
}
return $result;

ラムダ付きマップ

return array_map(function($number) {
    return $number * 10;
}, $numbers);

'static' 関数を使用したマップ。文字列参照として渡されます。

function tenTimes($number) {
    return $number * 10;
}
return array_map('tenTimes', $numbers);

他に何か方法はあるでしょうか?実際に聞いてみたら嬉しいです全て上記のケース間の違い、および他のケースではなく 1 つのケースを使用すべき理由についての入力。

ベストアンサー1

xdebug は、特に関数呼び出しにかなりのオーバーヘッドを追加するため、xdebug を無効にしてこのベンチマークを実行すると興味深いです。

これは5.6でxdebugを使って実行されたFGMのスクリプトです

ForEach   : 0.79232501983643
MapClosure: 4.1082420349121
MapNamed  : 1.7884571552277

xdebugなし

ForEach   : 0.69830799102783
MapClosure: 0.78584599494934
MapNamed  : 0.85125398635864

ここでは、 foreach バージョンとクロージャ バージョンの間にはごくわずかな違いしかありません。

クロージャ付きバージョンを追加するのも興味深いですuse

function useMapClosureI($numbers) {
  $i = 10;
  return array_map(function($number) use ($i) {
      return $number * $i++;
  }, $numbers);
}

比較のために以下を追加します:

function useForEachI($numbers)  {
  $result = array();
  $i = 10;
  foreach ($numbers as $number) {
    $result[] = $number * $i++;
  }
  return $result;
}

ここでは、配列は目立った変化がないのに対し、クロージャ バージョンには影響があることがわかります。

2015 年 11 月 19 日 比較のために、PHP 7 と HHVM を使用した結果も追加しました。結論は似ていますが、すべてがはるかに高速です。

PHP 5.6

ForEach    : 0.57499806880951
MapClosure : 0.59327731132507
MapNamed   : 0.69694859981537
MapClosureI: 0.73265469074249
ForEachI   : 0.60068697929382

PHP 7

ForEach    : 0.11297199726105
MapClosure : 0.16404168605804
MapNamed   : 0.11067249774933
MapClosureI: 0.19481580257416
ForEachI   : 0.10989861488342

HHVM

ForEach    : 0.090071058273315
MapClosure : 0.10432276725769
MapNamed   : 0.1091267824173
MapClosureI: 0.11197068691254
ForEachI   : 0.092114186286926

おすすめ記事