Объявление функций в подключаемых файлах. Функции объявляются очень быстро, поэтому для получение адекватных результатов, надо тестировать на очень большом количестве функций. Генератор PHP-файла с 1 млн. функций с разным количеством аргументов: Код (PHP): $str = '<?php'; for ($i = 0; $i < 1000000; $i++) { $str .= ' function ' . uniqid('fn') . '('; $str .= '$arg' . implode(',$arg', range(rand(0, 1), rand(1, 5))) . ')'; $str .= ' { return true; }'; } file_put_contents('1mlnfncs.php', $str); Получаем файл, объемом ~62Мб. Cкрипт для тестирования: Код (PHP): ini_set('memory_limit','2560M'); $start = microtime(1); include('1mlnfncs.php'); echo microtime(1) - $start; На среднем серваке получаем 5.8768661022186. Если закомментировать все функции сразу /* */, то include такого файла займет около 0,2 сек. Таким образом, объявление миллиона функций занимает чуть более 5,5 сек.
in_array() vs. array_key_exists() vs. isset() Если требуется загнать много значений в массив и потом многократно проверять присутствие в нем какого-либо значения, лучше записывать их как ключи, а не как элементы. Для теста используется массив с 0.5 млн значений и многократная проверка заведомо несуществующего значения. Проверка in_array(): Код (PHP): $arr = []; for ($i = 0; $i < 500000; $i++) { $arr[] = $i; } $t = microtime(1); for ($i = 0; $i < 100; $i++) { in_array(rand(999999, 9999999), $arr); } echo round(microtime(1) - $t, 3); // 1.276 Всего 100 проверок отнимают больше секунды. Это эквивалентно миллиону проверок ключей: Код (PHP): $arr = []; for ($i = 0; $i < 500000; $i++) { $arr[$i] = 1; } $t = microtime(1); for ($i = 0; $i < 1000000; $i++) { array_key_exists(rand(999999, 9999999), $arr); } echo round(microtime(1) - $t, 3); // 1.197 isset() работает до 2 раз быстрее: Код (PHP): $arr = []; for ($i = 0; $i < 500000; $i++) { $arr[$i] = 1; } $t = microtime(1); for ($i = 0; $i < 1000000; $i++) { isset($arr[rand(999999, 9999999)]); } echo round(microtime(1) - $t, 3); // 0.588
Добавление: разница должна быть заметна только на реально больших массивах. А объясняется это тем, что массив в PHP устроен как хеш-таблица — то есть оптимизирован для быстрого нахождения ключа в большом наборе. in_array() же тупо перебирает все элементы, пока не найдет совпадение. http://habrahabr.ru/post/162685/
PHP: <?php $array = range ( 0, 999999 ); $array = array_flip ( $array ); $a = microtime(1); $i = 10000000; while ( $i-- ) { //if ( in_array ( 999919, $array ) ) // failed //if ( array_key_exists ( 999919, $array) ) // 0.17 if ( isset ( $array[999919] ) ) // 0.15 { 1; } } printf ( '%.2f', microtime(1)-$a ); PHP 7.4.7
PHP 7.4.7 Мин время выполнения (иногда). Две функции работают одинаково по скорости. PHP: <?php $array = [ 1=>null,2=>null ]; $i = 50000000; $a = microtime (1); while ( $i-- ) { $b = array_key_first ( $array ); // 1.39 } printf ( '%.2f' . PHP_EOL, microtime (1) - $a ); $i = 50000000; $a = microtime (1); while ( $i-- ) { $b = key ( $array ); // 1.34 } printf ( '%.2f', microtime (1) - $a );
проверить или забить ? PHP: <?php $arr = [ 4 => 1, 8 => 1, 20 => 1 ]; $i = 100000000; $a = microtime (1); while ( $i-- ) { // isset ( $arr[8] ); // 2.23 // if ( ! isset ( $arr[8] ) ) // 2.50 $arr[8] = 1; // 1.73 } printf ( '%.2f', microtime (1) - $a ); PHP 7.4.7
PHP 7.4.7 PHP: <?php $i = 1000000; $a = microtime ( true ); while ( $i-- ) { strtr ( 'gg!!.g.!,.g,,', [ '!' => null, '.' => null, ',' => null ] ); } printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a ); $i = 1000000; $a = microtime ( true ); while ( $i-- ) { str_replace ( '!.,', '', 'gg!!.g.!,.g,,' ); } printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a ); 0.387 strtr 0.068 НО! PHP: <?php $a = '122333'; $arr = [ '1' => 'a', '2' => 'b', '3' => 'c', '333' => 'd', '22' => 'e', '33' => 'f', ]; echo strtr ( $a, $arr ) . PHP_EOL; echo str_replace ( array_keys ( $arr ), array_values ( $arr ), $a ); aed abbccc
PHP 7.4.7 что быстрее - с указанным диапазоном или внутренним ? PHP: <?php $i = 1000000; $a = microtime ( true ); while ( $i-- ) { mt_rand (); } printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a ); $i = 1000000; $a = microtime ( true ); while ( $i-- ) { mt_rand ( 1000000, 9999999 ); } printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a ); $i = 1000000; $a = microtime ( true ); while ( $i-- ) { mt_rand ( 1000, 9999 ); } printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a ); 0.022 0.043 0.043