配列を別の配列に変換するために使用されるこれら 3 つのアプローチ間のパフォーマンスの違い (ある場合) は何ですか?
- 使用
foreach
array_map
ラムダ/クロージャ関数の使用array_map
「static」関数/メソッドを使用する- 他のアプローチはありますか?
わかりやすくするために、すべて同じこと、つまり数値の配列を 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