1 заметка с тегом

call_user_func_array()

Скорость выполнения call_user_func_array() на разных версиях PHP

Решил сравнить скорость выполнения call_user_func_array() с обычным вызовом функций на разных версиях PHP и последним HHVM. Весь код измерения времени я запускал на 3v4l.org и фиксировал результаты в сводные таблицы. За основу взял функцию array_merge() с массивом MIME-типов и 1 млн раз вызывал её в цикле разными способами.

Код выше сравнивает скорость выполнения функции array_merge() с её вызовом через call_user_func_array(). Как видно, в седьмых версиях PHP нет никакой разницы по времени выполнения, а вот HHVM 3.22.0 остался на уровне PHP 5.6.30, хотя немного быстрее:

+--------------------------------------------------+----------+----------+----------+-----------+ | |PHP 5.6.30|PHP 7.0.24|PHP 7.1.10|HHVM 3.22.0| +--------------------------------------------------+----------+----------+----------+-----------+ |array_merge(...$args) |0.9381 |0.2910 |0.2945 |0.7795 | |call_user_func_array('array_merge', $args) |1.4194 |0.3073 |0.2938 |1.0372 | +--------------------------------------------------+----------+----------+----------+-----------+

В PHP 7.*.* провели хорошую оптимизацию и при вызове функций можно не задумываться об производительности call_user_func_array(). Это касается и вызова самописных функций и методов вызываемых из класса.

Замеры скорости получились следующие:

+--------------------------------------------------+----------+----------+----------+-----------+ | |PHP 5.6.30|PHP 7.0.24|PHP 7.1.10|HHVM 3.22.0| +--------------------------------------------------+----------+----------+----------+-----------+ |fn($args) |1.0934 |0.6369 |0.4660 |1.2059 | |$fn($args) |1.4507 |0.5399 |0.6090 |1.2501 | |$class->fn($args) |1.5088 |0.5622 |0.5282 |1.4568 | |call_user_func_array('fn', [$args]) |1.5022 |0.4198 |0.3750 |1.2159 | |call_user_func_array([new A, '__invoke'], [$args])|1.9369 |0.5629 |0.6538 |1.3701 | |call_user_func_array([new B, 'fn'], [$args]) |2.1243 |0.7088 |0.6625 |1.9792 | +--------------------------------------------------+----------+----------+----------+-----------+

В PHP 5.6.30 и HHVM 3.22.0 видно большую разницу при разных способах вызова функций, а в PHP 7.* как бы вы функцию не вызывали, её время выполнения будет примерно на одном уровне. Проще говоря, в последних версиях PHP вызов функций через call_user_func_array() и её исходных вариантах не имеет разницы.

10 октября   benchmark   call_user_func_array()   php