array_ * vs foreachまたはPHP7 vs PHP5

良い一日。 どういうわけか、舞台裏では、バージョン7で配列を操作するときに、標準のPHP関数のパフォーマンスが向上するという問題が残っていました。

以前のバージョンに関するこの質問を扱った記事( herehere )は、通常のループの方がパフォーマンスの点で有益であると述べています。

そして、 ここでは、7番目のバージョンのテストを既に見ることができます。 そして、すべてがそれほどユニークなわけではありません。 2015年11月19日のテストでは、ループと組み込み関数のパフォーマンスは同等であり、最後のトピックのみが考えさせられます。

そして、結果についてはどうですか...私は自分ですべてをチェックし、いくつかのテストを実行することにしました...

1)array_filter

ソースコード
$data = range(0, 10000); $start = microtime(true); $data = array_filter($data, function ($item) { return $item%2; }); $end = microtime(true); echo $end - $start.' '; $data = range(0, 10000); $start = microtime(true); $newData = array(); foreach ($data as $item) { if ($item%2) { $newData[] = $item; } } $end = microtime(true); echo $end - $start.' '; $data = range(0, 10000); $start = microtime(true); $newData = array(); $numItems = count($data); for($i=1;$i<=$numItems-1;$i++) { if ($data[$i]%2) { $newData[] = $data[$i]; } } $end = microtime(true); echo $end - $start.' '; $data = range(0, 10000); $start = microtime(true); $newData = array(); $numItems = count($data); $i = 0; while ($i <= $numItems-1) { if ($data[$i]%2) { $newData[] = $data[$i]; } $i++; } $end = microtime(true); echo $end - $start.' '; 


丸みを帯びた...
機能PHP5PHP7
array_filter0.002820.00136
foreach0.00130.00045
のために0.001710.00072
ながら0.001450.00054

2)array_map

ソースコード
 <?php $data = range(0, 10000); $start = microtime(true); $data = array_map(function ($item) { return $item+1; }, $data); $end = microtime(true); echo $end - $start; $data = range(0, 10000); $start = microtime(true); $newData = array(); foreach ($data as $item) { $newData[] = $item+1; } $end = microtime(true); echo $end - $start; $data = range(0, 10000); $start = microtime(true); $newData = array(); $numItems = count($data); for($i=0;$i<$numItems;$i++) { $newData[] = $data[$i]+1; } $end = microtime(true); echo $end - $start; $data = range(0, 10000); $start = microtime(true); $newData = array(); $numItems = count($data); $i = 0; while ($i < $numItems) { $newData[] = $data[$i]; $i++; } $end = microtime(true); echo $end - $start; 


機能PHP5PHP7
array_map0.004620.00094
foreach0.001550.00033
のために0.002200.00044
ながら0.001690.00054

3)array_walk

ソースコード
 $data = range(0, 10000); $start = microtime(true); $data = array_walk($data, function ($item) { return $item+1; }); $end = microtime(true); echo $end - $start; $data = range(0, 10000); $start = microtime(true); $newData = array(); foreach ($data as $item) { $newData[] = $item+1; } $end = microtime(true); echo $end - $start; $data = range(0, 10000); $start = microtime(true); $newData = array(); $numItems = count($data); for($i=0;$i<$numItems;$i++) { $newData[] = $data[$i]+1; } $end = microtime(true); echo $end - $start; $data = range(0, 10000); $start = microtime(true); $newData = array(); $numItems = count($data); $i = 0; while ($i < $numItems) { $newData[] = $data[$i]; $i++; } $end = microtime(true); echo $end - $start; 


機能PHP5PHP7
array_walk0.002850.00101
foreach0.002900.00088
のために0.002190.00043
ながら0.001730.00086

4)array_reduce

ソースコード
 $data = range(0, 10000); $start = microtime(true); $data = array_reduce($data, function ($carry, $item) { $carry += $item; return $carry; },0); $end = microtime(true); echo $end - $start; $data = range(0, 10000); $start = microtime(true); $newData = 0; foreach ($data as $item) { $newData+= $item; } $end = microtime(true); echo $end - $start; $data = range(0, 10000); $start = microtime(true); $newData = 0; $numItems = count($data); for($i=0;$i<$numItems;$i++) { $newData+= $data[$i]; } $end = microtime(true); echo $end - $start; $data = range(0, 10000); $start = microtime(true); $newData = 0; $numItems = count($data); $i = 0; while ($i < $numItems) { $newData+= $data[$i]; $i++; } $end = microtime(true); echo $end - $start; 


機能PHP5PHP7
array_reduce0.002390.00092
foreach0.000440.00020
のために0.000660.00029
ながら0.000620.00029

数字が相対的であることは明らかです。 しかし、いくつかの結論、親愛なる同僚は、私たちが描くことを可能にします。

Source: https://habr.com/ru/post/J340696/


All Articles