📜 ⬆️ ⬇️

array_ * vs foreach or PHP7 vs PHP5

Good day. Somehow behind the scenes was the question of the performance gains of standard PHP functions when working with arrays in version 7. *.

Articles (for example, here , here ) that covered this question about earlier versions, said that the usual cycles in terms of performance are more profitable.

And here you can already see the tests for the 7th version. And then not everything is so clear in it. In the tests of 11/19/2015, the cycles and built-in functions became equal in performance, and only the last topic leads us to think.

And what about the result ... I decided to check everything myself and run a few tests ...
')
1) array_filter

source
$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.' '; 


Rounded ...
functionPHP5PHP7
array_filter0.002820.00136
foreach0.00130.00045
for0.001710.00072
while0.001450.00054

2) array_map

source
 <?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; 


functionPHP5PHP7
array_map0.004620.00094
foreach0.001550.00033
for0.002200.00044
while0.001690.00054

3) array_walk

source
 $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; 


functionPHP5PHP7
array_walk0.002850.00101
foreach0.002900.00088
for0.002190.00043
while0.001730.00086

4) array_reduce

source
 $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; 


functionPHP5PHP7
array_reduce0.002390.00092
foreach0.000440.00020
for0.000660.00029
while0.000620.00029

It is clear that the numbers are relative. But some conclusions, dear colleagues, allow to do.

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


All Articles