Unserialize vs. Include
for ($i = 0; $i<10; $i++)
$a[$i] = array_merge($a, md5($i));
Результат записал в два файла. Один в виде serialize-представления, другой в виде PHP (собственная функция, аналог var_export).
Далее, в цикле (1000 итераций) сначала читал этот файл и unserializ'ил его в переменную, потом просто включал его через include.
Так вот. Результаты меня поразили. Я-то думал, что всё с точностью наоборот.
1000 штук unserialize выполнились за 10 секунд
1000 штук include за 25.
На одномерных массивах разница всего лишь в треть, но опять же проигрывает include. Этому, конечно, есть объяснение serialize-формат куда проще PHP, а, следовательно, и парсить его можно быстрее. До этого я замерял скорости serialize и var_export (выигрывал var_export) и был уверен, что с обратным преобразованием дело обстоит точно так же. Выходит ошибался.
В свое время тоже удивился, а потом понял — ничего удивительного.
Комментарий для Ktulhu:
Я тоже уже понял.
я еще больше удивился когда замерял include(xxx) vs eval(file_get_contants(xxx)))
и вообще include как-то странно работает именно над чтением файла (глючит -— я даже в bugs заслал инфу)
Комментарий для eddie:
А что за глюк?
праильно говорите, товарисчь)
http://www.livejournal.com/community/ru_webdev/133811.html
а то тама флейм развели)
http://bugs.php.net/?id=25072
Комментарий для eddie:
Нда.. действительно очень странно… :| Я им тоже как-то пару багов высылал — ни один не исправили. Один раз свалили всё на Apache, в другой — на GD :) Может они, конечно, и правы, но мне-то от этого не легче.
Вы можете повторить Ваш эксперимент для PHP 5.2.x?
В этой ветке разработчики ускорили include.
Комментарий для rinatmuhtarov.moikrug.ru:
Пока не могу, но его проводили другие люди, говорят, что с применением кешей/акселераторов (типа APC, XCache, eAccelerator) ситуация меняется прямо в обратную сторону — быстрее становятся именно include.