среда, 7 июля 2010 г.

memcache vs memached - сравниваем клиенты для PHP

performance


Какой клиент лучше использовать при разработке на PHP — php-memcached или php-memcache? Все зависит от того, какие особенности Вам нужны (неужели?). Давайте сравним в двух аспектах — функциональность и производительность.



Функциональность


Клиентская библиотека php-memcache была разработана еще в 2004 году и сегодня существует уже довольно стабильная версия, которая используется в 99.9% проектах (использующих сервер Memcache). Большим недостатком этой библиотеки является ее ограниченные способности — она реализует только часть протокола мемкеша, и не позволяет использовать его дополнительные возможности (какие именно — чуть ниже).


Библиотека php-memcached была разработана сравнительно недавно, но уже успешно используется на некоторых крупных проектах (например, digg.com — из которого и вышла эта разработка). Самое главное ее преимущество — это полная реализация протокола, в том числе:



  • CAS токены для версионирования ключей

  • Обратные вызовы (callbacks)

  • Метод getDelayed() позволяющий уменьшить время ожидания откладывая фактическое чтение ключей

  • Поддержка бинарного протокола

  • Возможность избежать сериализации используя igbinary


Производительность


Теперь давайте сравним производительность на практике.

Для этого напишем небольшой скрипт, который делает одинаковые операции с обоими клиентами:



<?

$ops = 10000;

$m = new Memcache();
$m->addServer('localhost');

$md = new Memcached();
$md->addServer('localhost', 11211);

echo "Test operations: {$ops}";
echo "<h3>get test</h3>";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $m->get( md5(rand(1000, 99999)) );
echo "Memcache: " . ($res['memcache']['set'] = microtime(true) — $s ) . "<br />";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $md->get( md5(rand(1000, 99999)) );
echo "Memcached: " . ($res['memcached']['set'] = microtime(true) — $s );

echo "<h3>set test</h3>";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $m->set(md5(rand(1000, 99999)), 2);
echo "Memcache: " . ($res['memcache']['get'] = microtime(true) — $s ) . "<br />";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $md->set(md5(rand(1000, 99999)), 2);
echo "Memcached: " . ($res['memcached']['get'] = microtime(true) — $s );

echo "<h3>delete test</h3>";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $m->delete(md5(rand(1000, 99999)));
echo "Memcache: " . ($res['memcache']['delete'] = microtime(true) — $s ) . "<br />";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $md->delete(md5(rand(1000, 99999)));
echo "Memcached: " . ($res['memcached']['delete'] = microtime(true) — $s );

echo "<h3>combined test</h3>";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ )
{
$key = md5(rand(1000, 99999));
$m->set($key, 2);
$m->get($key);
$m->delete($key);
}
echo "Memcache: " . ($res['memcache']['combined'] = microtime(true) — $s ) . "<br />";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ )
{
$key = md5(rand(1000, 99999));
$md->set($key, 2);
$md->get($key);
$md->delete($key);
}
echo "Memcached: " . ($res['memcached']['combined'] = microtime(true) — $s );

Как видно, скрипт просто выполняет основные операции сохранения, чтения и удаления ключей 10 тыс. раз и замерает их время для каждого клиента.


Результаты работы теста



Как видно из графика, производительность клиента php-memcache почти втрое выше, чем php-memcached. Следует учесть, что показатели при работе с бинарным протоколом почти не отличалась по времени от ASCII протокола.


В качестве вывода следует сказать, что клиент php-memcache лучше использовать, если функционала приложению полностью хватает (лучше, т.к. он быстрее). Если нужны расширенные возможности, то нужно использовать php-memcached. Но в этом случае нужно учесть понижение производительности.


Хотя важно заметить: даже не смотря на трехкратное различие в скорости работы, операции общения с сервером Memcache обычно занимают доли процента от времени исполнения приложения. Различие в скорости работ библиотек может быть заметно только при массовой работе с кешом, или же на огромных объемах данных.



Google Bookmarks Digg I.ua Ru-marks Ruspace Zakladok.net Reddit delicious Technorati Yahoo My Web News2.ru БобрДобр.ru Memori.ru rucity.com



Related posts:

  1. Memcached Multi-Get, зачем?
  2. Твиттер на основе MemcacheDB и PHP
  3. Очередь сообщений на основе PHP и MemcacheQ

Комментариев нет:

Отправить комментарий