2013-10-24 2 views
0

Я хочу измерить точное время загрузки кучи констант в php-файлах. Я выбрал 4 метод:константы loading benchmark

  • с помощью пары массива ключа-значения (возвращает массив данных в PHP файл)
  • с использованием класса с константами в нем
  • определяет
  • JSON (написать json_encoded значения в файл и загрузить их с помощью file_get_contents и json_decode)

Сначала я создал 4 различные файлы с этими методами, а затем заполнил их с 5000 случайными парами имени-значения (тем же значением для всех).

Я попытался загрузить их на PHP и использовал функцию microtime для измерения времени загрузки, но результаты кажутся немного странными! Это мой test.php файл:

// array 
$time['array']['start'] = microtime(true); 
$config_a = include('conf_array.php'); 
$time['array']['end'] = microtime(true); 
// class 
$time['class']['start'] = microtime(true); 
include('conf_class.php'); 
$config_c = new Config(); 
$time['class']['end'] = microtime(true); 
// define 
$time['defin']['start'] = microtime(true); 
include('conf_define.php'); 
$time['defin']['end'] = microtime(true); 
// json 
$time['json']['start'] = microtime(true); 
$config_j = json_decode(file_get_contents('conf_json.json')); 
$time['json']['end'] = microtime(true); 

foreach ($time as $name => $item) { 
    echo $name . ": " . (($item['end'] - $item['start']) * 1000) . " units."; 
} 

Когда я загружаю test.php с набором новых созданных файлов, я получаю эти результаты:

Array: 7.9629421234131 units. 
Class: 6.5279006958008 units. 
Defin: 19.877910614014 units. 
Json: 4.4741630554199 units. 

но когда я ударил кнопку обновления (F5), результаты будут меняться! Ниже приведены результаты одного и того же образца после обновления страницы:

Array: 1.7659664154053 units. 
Class: 2.467155456543 units. 
Defin: 6.4060688018799 units. 
Json: 4.9409866333008 units. 

И тогда заказ больше не изменится. Кажется, что php-файлы (все, кроме json) будут загружаться быстрее, когда вы загружаете их более одного раза. То же самое произойдет, если я перезапущу apache (вместе с PHP).

Мне было интересно, почему это происходит ?! Связано ли это с каким-то кешированием?

ответ

1

Я не знаю, действительно ли Apache выполняет базовое кэширование, но я думаю, что это не должно быть по дизайну. Там может быть несколько установленных модулей, которые вызывают такое поведение:

  1. mod_cache
  2. mod_file_cache
  3. APC который кэширует скомпилированный PHP в памяти. (и мог бы объяснить, почему файл JSON txt не затрагивается)

Возможно, у вас есть какие-либо из этих или, возможно, другие, которые являются причиной этого эффекта.