И это уже не первый раз когда нативная PHP конструкция/функция была медленнее чем аналоги на самом PHP (но сейчас call_user_func_array быстрее чем была, может быть и require_once доведут до ума :) ).
Вот моих четыре топ функций:
Много кода
/**
* Загрузка и проверка файла через статическую переменную
*/
function load ($file) {
static $files = null;
$files or $files = [];
if (!isset($files[$file])) {
require($file);
$files[$file] = true;
}
}
/**
* Загрузка и проверка файла через статическое свойство и метод
*/
class Loader {
public static $files = [];
public static function load ($file) {
if (!isset(self::$files[$file])) {
require($file);
self::$files[$file] = true;
}
}
}
/**
* Загрузка и проверка файла через замыкание
*/
function loadFuncional () {
$files = [];
return function ($file) use (&$files) {
if (!isset($files[$file])) {
require($file);
$files[$file] = true;
}
};
}
/**
* Загрузка и проверка файла через замыкание со статической переменной
*/
function loadFuncional2 () {
return function ($file) {
static $files = null;
$files or $files = [];
if (!isset($files[$file])) {
require($file);
$files[$file] = true;
}
};
}
/**
* Benchmark
*/
$times = 100000;
$time1 = microtime(true);
// require_once должен быть запущен первым, т.к. require и require_once работают вместе
for ($i = 0; $i < $times; $i ++) {
require_once('inc.php');
}
$end1 = microtime(true) - $time1;
$time2 = microtime(true);
for ($i = 0; $i < $times; $i ++) {
load('inc.php');
}
$end2 = microtime(true) - $time2;
$time3 = microtime(true);
for ($i = 0; $i < $times; $i ++) {
Loader::load('inc.php');
}
$end3 = microtime(true) - $time3;
$time4 = microtime(true);
$fileFunc = loadFuncional();
for ($i = 0; $i < $times; $i ++) {
$fileFunc('inc.php');
}
$end4 = microtime(true) - $time4;
$time5 = microtime(true);
$fileFunc = loadFuncional2();
for ($i = 0; $i < $times; $i ++) {
$fileFunc('inc.php');
}
$end5 = microtime(true) - $time5;
echo "require_once = $end1 vs
load = $end2 vs
Loader::load = $end3 vs
Closure = $end4
Closure with static = $end5";
И таков вот вывод:
1-ый раз:
require_once = 2.42880 vs
load = 0.43684 vs
Loader::load = 0.50142 vs
Closure = 0.94501 vs
Closure with static = 1.02279
2-ой раз:
require_once = 2.27990 vs
load = 0.54540 vs
Loader::load = 0.34147 vs
Closure = 0.96427 vs
Closure with static = 0.93723
3-ий раз:
require_once = 2.29130 vs
load = 0.37280 vs
Loader::load = 0.44514 vs
Closure = 0.89424 vs
Closure with static = 1.09342
Функция load со статической переменной выигрывает остальные варианты (хотя если запустить этот же тест несколько раз, то Loader::load иногда быстрее чем load).
Делитесь своими мыслями :)
_____________
Мой блог