Deepmemo logo
<div class="textheader_h1">Сравнительный тест систем кэширования пользовательских данных для PHP.</div> <br /> <div style="text-align: left;">Роман Чернышов (<a href="mailto:rxl@mail.ru">rxl@mail.ru</a>)<br /> 15.08.2008</div> <br /> <div style="text-align: justify;"> <div class="textheader_h2">Содержание.</div> <br /> <ul style="margin-top: 0pt; margin-bottom: 0pt;"> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p1">Введение.</a></li> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2">Краткий обзор.</a><br /> <ul style="margin-top: 0pt; margin-bottom: 0pt;"> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2_1">eAccelerator</a></li> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2_2">APC</a></li> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2_3">XCache</a></li> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p2_4">Memcache</a></li> </ul> </li> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p3">Подготовка к тестам.</a></li> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p4">Тесты.</a><br /> <ul style="margin-top: 0pt; margin-bottom: 0pt;"> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p4_1">Тест первый. Зверский.</a></li> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p4_2">Тест второй. Многократное чтение.</a></li> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p4_3">Тест третий. В погоне за реальностью.</a></li> </ul> </li> <li><a href="http://club.shelek.ru/viewart.php?id=300#post_p5">Заключение.</a></li> </ul> <br /> <span id="post_p1"></span> <div class="textheader_h2"><span id="post_p1">Введение.</span></div> <span id="post_p1"><br /></span> <div class="para"><span id="post_p1">Началось все с того, что захотелось уменьшить время отклика страниц. Не разбираясь особо, я поставил на наш <a href="http://club.shelek.ru/" target="_blank">клубный сервер</a> eAccelerator. Он умеет кэшировать скомпилированные в байт-код php-файлы, имеет оптимизатор кода и позволяет кэшировать пользовательские данные и данные сессий. Время отклика снизилось на разных сайтах в 2-10 раз, в зависимости от внутренней логики движков: которые по проще - страницы просто вылетают, которые по мудренее - немного по быстрее стали работать.</span></div> <div class="para"><span id="post_p1">Потом в голове возник вопрос: а правильный ли выбор я сделал. Стал искать сравнительные тесты в интернете и ничего стоящего не нашел. Даже странно стало: оптимизаторы php существуют не первый год, а сравнений никто не производил. Даже если кто их и делал, то в поисковых системах они погребены под горами мусора.</span></div> <div class="para"><span id="post_p1">Рассмотрев список бесплатно доступных систем, составил следующий список: eAccelerator, APC, XCache и Memcache.</span></div> <div class="para"><span id="post_p1">Первые три умеют кэшировать скомпилированные php-файлы, eAccelerator и APC имеют оптимизаторы кода, Memcache же является отдельным кэширующим сервером и к php имеет отношение только тем, что для работы с ним существует php-модуль.</span></div> <span id="post_p1"><br /> <span id="post_p2"></span></span> <div class="textheader_h2"><span id="post_p1">Краткий обзор.</span></div> <span id="post_p1"><br /> <span id="post_p2_1"></span></span> <div class="textheader_h3"><span id="post_p1">eAccelerator</span></div> <span id="post_p1"><br /> <a href="http://bart.eaccelerator.net/doc/phpdoc/" target="_blank" rel="nofollow">http://bart.eaccelerator.net/doc/phpdoc/</a><br /></span> <div class="para"><span id="post_p1">По API больше понравился eAccelerator. API простое - только самое нужное, но есть и такие возможности, которых нет у других - функции блокировки ключа. Документация неудобная, но информация понятна и есть толковые примеры. Он также лучше и удобнее в настройках. Позволяет отдельно управлять хранением ключей, сессий и данных (скомпилированного кода и пользовательских данных). Методы хранения: только в разделяемой памяти, в памяти и на диске одновременно, в памяти с вытеснением на диск и только на диске. Легко и прозрачно можно отделить ключи каждого виртуального сервера в системе, чтобы не было лишних дырок в безопасности и пересечения ключей, установкой уникального значения параметра <tt>eaccelerator.name_space</tt> для каждого виртуального сервера. Переписал код club.shelek.ru на работу с кэшом: среднее время генерации страницы всего 4-5 мс против 90-120 без кэша. Против ожидания, что нагрузка на процессор и память возрастет, наблюдаю наоборот - снижение за счет меньшей нагрузки на базу данных. Посмотрим, как он покажет себя при длительной эксплуатации.</span></div> <span id="post_p1"><br /> <span id="post_p2_2"></span></span> <div class="textheader_h3"><span id="post_p1">APC</span></div> <span id="post_p1"><br /> <a href="http://www.php.net/apc" target="_blank" rel="nofollow">http://www.php.net/apc</a><br /></span> <div class="para"><span id="post_p1">APC очень обилен в настройках. Пока я предпочел не крутить настройки и пользоваться значениями по умолчанию. API очень маленькое. Интересная фича - сохранение массива и восстановление его как набора констант. Редкая по нужности фича.</span></div> <span id="post_p1"><br /> <span id="post_p2_3"></span></span> <div class="textheader_h3"><span id="post_p1">XCache</span></div> <span id="post_p1"><br /> <a href="http://xcache.lighttpd.net/wiki/XcacheApi" target="_blank" rel="nofollow">http://xcache.lighttpd.net/wiki/XcacheApi</a><br /></span> <div class="para"><span id="post_p1">После eAccelrator и APC, XCache ничем хорошим не удивил. Отвратительная документация по API без единого комментария (я назвал ее - "черный квадрат"), хотя для базовых функций даны примеры и то хорошо. API простое. Из особенностей - возможность выполнять инкремент и декремент числового значения в кэше и функция проверки наличия ключа в кэше без пересылки самого значения. Настроек довольно мало. Удивило то, что кэширование, по умолчанию, разрешено, но размер используемой памяти и максимальные размеры пользовательских объектов равны нолю, что по документации означает - "запрещено".</span></div> <span id="post_p1"><br /> <span id="post_p2_4"></span></span> <div class="textheader_h3"><span id="post_p1">Memcache</span></div> <span id="post_p1"><br /> <a href="http://www.php.net/memcache" target="_blank" rel="nofollow">http://www.php.net/memcache</a><br /></span> <div class="para"><span id="post_p1">Memcache минималистичен в настройках, так как настройки управления кэшированием находятся на стороне сервера memcached. API у него посложнее, чем у первых трех систем, и поддерживает работу в процедурном и ООП способах. Из особенностей: помимо функции установки значения по ключу, есть возможность добавить ключ, только если его еще нет, и перезаписать, только если он уже есть. Может иметь несколько кэширующих серверов: как на том же хосте, так и на других. Как я понял, суть Memcache в использовании ресурсов других хостов. По моему мнению, это несколько устарело: если ресурсов одного хоста не хватает, то лучше найти другой способ распределить нагрузку, чем коммуникация по TCP с кэширующими серверами на других хостах, что вносит существенную задержку. Тем не менее, Memcache в сети упоминается часто, из чего делаю вывод о его популярности и включаю в список тестируемых систем.</span></div> <span id="post_p1"><br /> <span id="post_p3"></span></span> <div class="textheader_h2"><span id="post_p1">Подготовка к тестам.</span></div> <span id="post_p1"><br /></span> <div class="para"><span id="post_p1">Тестировать все это на живом сервере я не рискнул и использовал виртуальную машину. Все программы, которые могли вызвать неожиданную нагрузку на систему и повлиять на результаты замеров, были остановлены.</span></div> <div class="para"><span id="post_p1">Условия тестов:</span></div> <span id="post_p1"><br /></span> <ul style="margin-top: 0pt; margin-bottom: 0pt;"> <li><span id="post_p1">Хост система: одноядерный P4 2800 ГГц, 1.5 ГБ памяти DDR-400, Windows XP Professional SP2, VMware Workstation 5.5.1.</span></li> <li><span id="post_p1">Виртуальная система: 512 МБ, Linux CentOS 5.1, Apache 2.2.3, PHP 5.1.6, gcc 4.1.2.</span></li> </ul> <span id="post_p1"><br /></span> <div class="para"><span id="post_p1">Тестируемые программы были собраны на это виртуальном хосте с дополнительным ключом компиляции <tt>-O3</tt>. Для компиляции потребовалось скомпилировать и установить программу re2c версии 0.13.5.</span></div> <div class="para"><span id="post_p1">Версии программ:</span></div> <span id="post_p1"><br /></span> <ul style="margin-top: 0pt; margin-bottom: 0pt;"> <li><span id="post_p1">eAccelerator - 0.9.5.3</span></li> <li><span id="post_p1">APC - 3.0.19</span></li> <li><span id="post_p1">XCache - 1.2.2</span></li> <li><span id="post_p1">Memcache - 3.0.1</span></li> <li><span id="post_p1">Memcached - 1.2.6</span></li> </ul> <span id="post_p1"><br /></span> <div class="para"><span id="post_p1">Всем кэш-системам было выделено по 64 МБ разделяемой памяти. Оптимизация кода была включена.&nbsp; &nbsp;Перед каждым тестом каждой системы исправлялся конфиг php.ini, чтобы загружалась только тестируемая система, и выполнялся рестарт демона httpd.</span></div> <div class="para"><span id="post_p1">Лимит времени работы скрипта был убран, память выделяемая процессу - 200МБ (сперва было 16, но об этом чуть позже). Время измерялось php-функцией <tt>microtime(true)</tt> - с точностью до микросекунд.</span></div> <div class="para"><span id="post_p1">Работу с кэш-системами обеспечивал несколькими днями ранее написанный класс.</span></div> <span id="post_p1"><br /></span> <div class="codeheader"><span id="post_p1">Код: (php)</span></div> <div class="code"><span id="post_p1"></span> <pre style="margin-top: 0pt; display: inline;" class="code_pre"> <span id="post_p1"><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><?php<br><br></span><span style="color: rgb(255, 128, 0); ">// (c) 2008 Veselchak U<br><br></span><span style="color: rgb(0, 119, 0); ">class </span><span style="color: rgb(0, 0, 187); ">Cache<br></span><span style="color: rgb(0, 119, 0); ">{<br> var </span><span style="color: rgb(0, 0, 187); ">$_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(221, 0, 0); ">'auto'</span><span style="color: rgb(0, 119, 0); ">; </span><span style="color: rgb(255, 128, 0); ">// дефолтное значение<br></span><span style="color: rgb(0, 119, 0); ">var </span><span style="color: rgb(0, 0, 187); ">$_memcache </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">;<br><br> function </span><span style="color: rgb(0, 0, 187); ">__constructor</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$options </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">)<br> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">Cache</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">);<br> }<br><br> function </span><span style="color: rgb(0, 0, 187); ">Cache</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$options </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">)<br> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(255, 128, 0); ">// Проверка поддержки кеш-систем<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems </span><span style="color: rgb(0, 119, 0); ">= array();<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">function_exists</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'eaccelerator_get'</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">[] = </span><span style="color: rgb(221, 0, 0); ">'eaccelerator'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">function_exists</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'apc_fetch'</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">[] = </span><span style="color: rgb(221, 0, 0); ">'apc'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">function_exists</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'xcache_get'</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">[] = </span><span style="color: rgb(221, 0, 0); ">'xcache'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">class_exists</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'Memcache'</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">[] = </span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$required_cache </span><span style="color: rgb(0, 119, 0); ">= isset(</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'cache'</span><span style="color: rgb(0, 119, 0); ">]) ? </span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'cache'</span><span style="color: rgb(0, 119, 0); ">] : </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">count</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">) && </span><span style="color: rgb(0, 0, 187); ">$required_cache </span><span style="color: rgb(0, 119, 0); ">!= </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$required_cache </span><span style="color: rgb(0, 119, 0); ">== </span><span style="color: rgb(221, 0, 0); ">'auto'</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">array_shift</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">); </span><span style="color: rgb(255, 128, 0); ">// первое значение в списке<br></span><span style="color: rgb(0, 0, 187); "> else if (</span><span style="color: rgb(0, 0, 187); ">in_array</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$required_cache</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$cache_systems</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">$required_cache</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> else<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> }<br></span><span style="color: rgb(0, 0, 187); "> else<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">== </span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$failed </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">true</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> if (isset(</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">]) && </span><span style="color: rgb(0, 0, 187); ">is_array</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">]))<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache </span><span style="color: rgb(0, 119, 0); ">= new </span><span style="color: rgb(0, 0, 187); ">Memcache</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> foreach (</span><span style="color: rgb(0, 0, 187); ">$options</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">] as </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> if (!</span><span style="color: rgb(0, 0, 187); ">is_array</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">) || !isset(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'host'</span><span style="color: rgb(0, 119, 0); ">])) </span><span style="color: rgb(255, 128, 0); ">// host должен быть указан<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> continue;<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'port'</span><span style="color: rgb(0, 119, 0); ">] = isset(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'port'</span><span style="color: rgb(0, 119, 0); ">]) ? (int) </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'port'</span><span style="color: rgb(0, 119, 0); ">] : </span><span style="color: rgb(0, 0, 187); ">ini_get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(221, 0, 0); ">'memcache.default_port'</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'persistent'</span><span style="color: rgb(0, 119, 0); ">] = isset(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'persistent'</span><span style="color: rgb(0, 119, 0); ">]) ? (bool) </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'persistent'</span><span style="color: rgb(0, 119, 0); ">] : </span><span style="color: rgb(0, 0, 187); ">true</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">addServer</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'host'</span><span style="color: rgb(0, 119, 0); ">], </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'port'</span><span style="color: rgb(0, 119, 0); ">], </span><span style="color: rgb(0, 0, 187); ">$server</span><span style="color: rgb(0, 119, 0); ">[</span><span style="color: rgb(221, 0, 0); ">'persistent'</span><span style="color: rgb(0, 119, 0); ">]))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$failed </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">false</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> }<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$failed</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> }<br><br></span><span style="color: rgb(0, 0, 187); "> if (</span><span style="color: rgb(0, 0, 187); ">$failed</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">;<br></span><span style="color: rgb(0, 0, 187); "> }<br> }<br><br> function </span><span style="color: rgb(0, 0, 187); ">get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">)<br> {<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">null</span><span style="color: rgb(0, 119, 0); ">;<br><br></span><span style="color: rgb(0, 0, 187); "> switch (</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'eaccelerator'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">eaccelerator_get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'apc'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">apc_fetch</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'xcache'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">xcache_get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$data </span><span style="color: rgb(0, 119, 0); ">= </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">get</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> }<br><br></span><span style="color: rgb(0, 0, 187); "> return </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">;<br> }<br><br> function </span><span style="color: rgb(0, 0, 187); ">put</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, &</span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">)<br> {<br></span><span style="color: rgb(0, 0, 187); "> switch (</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_cache_type</span><span style="color: rgb(0, 119, 0); ">)<br></span><span style="color: rgb(0, 0, 187); "> {<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'none'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'eaccelerator'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">eaccelerator_put</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'apc'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">apc_store</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'xcache'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">xcache_set</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">);<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> case </span><span style="color: rgb(221, 0, 0); ">'memcache'</span><span style="color: rgb(0, 119, 0); ">:<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(255, 128, 0); ">// Решение set() проблемы с несколькими серверами.<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(255, 128, 0); ">// http://www.php.net/manual/ru/function.memcache-set.php#840<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> if (!</span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">replace</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">MEMCACHE_COMPRESSED</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">))<br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); ">$this</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">_memcache</span><span style="color: rgb(0, 119, 0); ">-></span><span style="color: rgb(0, 0, 187); ">set</span><span style="color: rgb(0, 119, 0); ">(</span><span style="color: rgb(0, 0, 187); ">$key</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$data</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">MEMCACHE_COMPRESSED</span><span style="color: rgb(0, 119, 0); ">, </span><span style="color: rgb(0, 0, 187); ">$ttl</span><span style="color: rgb(0, 119, 0); ">);<br><br></span><span style="color: rgb(0, 0, 187); "> </span><span style="color: rgb(0, 0, 187); "> break;<br></span><span style="color: rgb(0, 0, 187); "> }<br> }<br>}<br><br></span><span style="color: rgb(0, 0, 187); ">?></span></span><br /></span> </pre></div> <br /> <div class="para">Для тестов были созданы 4 файла:</div> <br /> <div align="center"> <table style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" class="tgrid" cellpadding="4" cellspacing="0"> <tbody> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Название</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Размер</b></td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">Тест 1</td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">1028299</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">Тест 2</td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">101600</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">Тест 3</td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">10081</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top">Тест 4</td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">1010</div> </td> </tr> </tbody> </table> </div> <br /> <div class="para">Содержимое каждого файла представляет из себя сериализованный массив, заполненный случайными значениями. Размеры их, как видите, приблизительно равны 1МБ, 100кБ, 10кБ и 1кБ. В каждом тесте, каждая система тестировалась с каждым из этих файлов.</div> <br /> <span id="post_p4"></span> <div class="textheader_h2"><span id="post_p4">Тесты.</span></div> <span id="post_p4"><br /></span> <div class="para"><span id="post_p4">Заранее говорю, что тесты искусственные. К реальности приближен только третий тест, но и у него временами были трудности с точностью измерения очень малых промежутков времени. Главное здесь в сравнении работы четырех подопытных кэш-систем в одинаковых условиях.</span></div> <div class="para"><span id="post_p4">Для большей наглядности я добавил к тестируемым кэш-системам еще и простое чтение файла. В первом тесте из было два:</span></div> <ul style="margin-top: 0pt; margin-bottom: 0pt; list-style-type: decimal;"> <li><span id="post_p4">Открытие файла, запись, перемещение позиции на начало, чтение, закрытие.</span></li> <li><span id="post_p4">Открытие файла, запись, закрытие и последующее чтение функцией <tt>file_get_contents()</tt>.</span></li> </ul> <div class="para"><span id="post_p4">Для остальных тестов использовалось только чтение файла функцией <tt>file_get_contents()</tt>.</span></div> <span id="post_p4"><br /> <span id="post_p4_1"></span></span> <div class="textheader_h3"><span id="post_p4">Тест первый. Зверский.</span></div> <span id="post_p4"><br /></span> <div class="para"><span id="post_p4">Алгоритм теста такой: в кэш загружается пара ключ-значение и тут же считывается. Операция многократно повторяется. Контрольное время замеряется до и после цикла. Тест повторяется пять раз в течении одного запуска тестового скрипта. Результатом будет среднее значение этих пяти замеров.</span></div> <div class="para"><span id="post_p4">Я подумал, что если размеры тестовых данных уменьшаются в десять раз от файла к файлу, то и число повторов тестовой операции стоит повышать в десять раз при переходе к следующему файлу. Для файла "Тест 1" было выполнено 10 повторов. Соответственно, для файла "Тест 4" - 10000.</span></div> <div class="para"><span id="post_p4">Результаты тестирования представлены в таблице. Время - в секундах.</span></div> <span id="post_p4"><br /></span> <div align="center"><span id="post_p4"></span> <table style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" class="tgrid" cellpadding="4" cellspacing="0"> <tbody> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Система</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 1</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 2</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 3</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 4</b></td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Файл 1</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">2.336</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">2.561</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">2.191</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">5.407</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Файл 2</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">2.571</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">2.128</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">3.088</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">8.406</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>eAccelerator</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.432</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.402</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.338</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.475</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>APC</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">9.699</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">10.036</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">10.264</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">13.970</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>XCache</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.482</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.946</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.928</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">1.521</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Memcache</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">3.918</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">3.508</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">3.650</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">4.804</div> </td> </tr> </tbody> </table> </div> <span id="post_p4"><br /></span> <div class="para"><span id="post_p4">В графическом виде это выглядит так:</span></div> <span id="post_p4"><br /></span> <div align="center"><span id="post_p4"><img src="http://deepmemo.com/data/quotes/2008/08/27/14/17/917babb97e" alt="" border="0" lowsrc="http://files.shelek.su/articles/imgforarticles/rxl/temp/test1." width="400" height="" /></span></div> <span id="post_p4"><br /></span> <div class="para"><span id="post_p4">Сперва протестировал работу с файлами, eAccelerator, APC и Memcache, а когда перешел к XCache, то скрипт стал аварийно завершаться. В логах Апача было сообщение о нехватке памяти. Увеличил размер с 16 до 32 МБ и повторил эксперимент: опять падение. 128 МБ - тоже. 192 - опять. На 200 МБ скрипт отработал до конца без ошибок. Вот такой вот он - XCache. Пришлось проводить тест для всех систем заново, с едиными условиями. При этом время работы всех систем, кроме Memcache, серьезно сократилось: в 1.5-2 раза. Видимо, за счет уменьшения работ по сборке мусора.</span></div> <div class="para"><span id="post_p4">Поразила скорость APC: в 2-4 раза медленнее, чем работа с файлами. Memcache тоже оказался не на высоте. eAccelerator, похоже, даже не заметил разницу: что 1 МБ, что 1 кБ, что 10 циклов, что 10000.</span></div> <span id="post_p4"><br /> <span id="post_p4_2"></span></span> <div class="textheader_h3"><span id="post_p4">Тест второй. Многократное чтение.</span></div> <span id="post_p4"><br /></span> <div class="para"><span id="post_p4">На следующий день я поискал в интернете впечатления других людей о APC - аутсайдере моего теста, и, что интересно, ничего плохого не нашел. По этому я решил сделать еще один тест, более приближенный к реальности. За основу взял первый тест и изменил алгоритм: считывается тестовый файл, помещается в кэш и в цикле считывается. Время измерялось до функции чтения и после, помещалось в массив, а после цикла производилось усреднение результата. Количество циклов было аналогично первому тесту: от 10 до 10000.</span></div> <div class="para"><span id="post_p4">Результаты представлены в таблице. Время - в секундах.</span></div> <span id="post_p4"><br /></span> <div align="center"><span id="post_p4"></span> <table style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" class="tgrid" cellpadding="4" cellspacing="0"> <tbody> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Система</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 1</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 2</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 3</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Тест 4</b></td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>Файл</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.121911</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.008692</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.001274</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.000242</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>eAccelerator</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.025335</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.002391</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.000201</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.000025</div> </td> </tr> <tr> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"><b>APC</b></td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.099481</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none; color: inherit;" valign="top"> <div style="text-align: right;">0.008770</div> </td> <td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-
Rating: [ 0 ]
Posted by forrest |