Комментарии 10

время сливать карму
Но некоторые выводы, уважаемые коллеги, сделать позволяют.
например что делать подобным образом подобные микро-бенчмарки не очень-то хорошая идея. Есть замечательный инструмент для подобного: phpbench. Как минимум с точки зрения статистической погрешности будет чище.
Далее, какие выводы еще мы можем сделать… Да собственно никаких. Методика проведения измерений мягко скажем не дает вообще никаких данных о том какие выводы мы можем сделать. Да, циклы будут всегда быстрее (особенно foreach) чем array_* функции тупо за счет отсутствия необходимости делать вызов функции на каждую итерацию. Причем что то что то — константа и на объемах выборок менее скажем десятков миллионов нам в целом плевать какой из вариантов мы используем.
Позвольте привести мою версию вашего бенчмарка (мне лень потому возьму только array_filter
:
Исходник
<?php
/**
* @BeforeMethods({"init"})
*/
class ArrayFilterBenchmark
{
public function init()
{
$this->data = range(1, 100000);
}
public function benchArrayFilter()
{
array_filter($this->data, function ($item) {
return $item % 2;
});
}
public function benchForeach()
{
$data = $this->data;
$newData = array();
foreach ($data as $item) {
if ($item % 2) {
$newData[] = $item;
}
}
}
}
Результаты
PhpBench 0.13.0. Running benchmarks.
\ArrayFilterBenchmark
benchArrayFilter I99 P0 [μ Mo]/r: 7,321.920 7,036.505 (μs) [μSD μRSD]/r: 576.149μs 7.87%
benchForeach I99 P0 [μ Mo]/r: 4,389.150 4,198.309 (μs) [μSD μRSD]/r: 463.250μs 10.55%
2 subjects, 200 iterations, 2 revs, 0 rejects
(best [mean mode] worst) = 3,947.000 [5,855.535 5,617.407] 6,370.000 (μs)
⅀T: 1,171,107.000μs μSD/r 519.700μs μRSD/r: 9.212%
Запускалось на MacBook Pro 15" 2017, без XDebug.
PHP 7.1.4 (cli) (built: May 6 2017 10:02:00) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.1.4, Copyright (c) 1999-2017, by Zend Technologies
А вот другой аспект использования array_*
функций, такой как возможность выстроить тело цикла как композицию функций, этот момент как раз таки и важен.
проведите подобные тесты с помощью специализированного инструмента.
в ваших тестах, как минимум, ничего не сказано про потребляемую память и нет вариантов с разными данными в массивах.
Есть подозрение, что Вы измеряли время, которое тратится на 10000 вызовов функции и возврат результата из этой функции. Попробуйте применить более «тяжелые» вычисления и это время станет незаметно в общем результате.
$data = array_walk(...)
, вы же затёрли массив $data
на boolean
-значение. Да и параметр $item
, полагаю, следовало бы оформить как ссылку, чтобы соответствовать другим участкам кода.Т.е. лучше оформить так этот кусок
array_walk($data, function (&$item) {
$item += 1;
});
array_* vs foreach или PHP7 vs PHP5