[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: require_once медленнее чем самописная функция
Страницы: 1, 2
volter9
В общем игрался я с оптимизацией, и вот такое нашел в PHP: require_once работает медленнее чем самописная функция/класс на PHP. Я знал что require_once медленная, но не до такой степени что бы проигрывать пользовательской функции.

И это уже не первый раз когда нативная 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).

Делитесь своими мыслями :)

_____________
Мой блог
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.