Бенчмарки и всякое такое

parse_ini_string() vs json_decode() vs unserialize() performance

Ясно, что в реальном мире данные для парсинга, придется доставать чем-то вроде parse_ini_file() или file_get_contents() но накладные расходы на вызовы системных fopen()/fclose() в таком контексте, мы можем просто опустить, в силу их одинаковости.

/* parse_ini  */
$data="parama=1"."\n"."paramb=2";
for($i=0;$i<10000000;$i++) {
$tmp=parse_ini_string($data);
}
 
// 18.33s
 
/* json data decoding */
$data='{"parama":1,"paramb":2}';
for($i=0;$i<10000000;$i++) {
$tmp=json_decode($data);
} 
 
// 20.43s
 
/* native PHP unserialize */
$data='a:2:{s:6:"parama";s:1:"1";s:6:"paramb";s:1:"2";}';
for($i=0;$i<10000000;$i++) {
$tmp=unserialize($data);
} 
 
// 11.36s

Итого делаем несложный вывод - json_decode таки самый медленный из этой троицы, в силу накладных расходов на парсинг более сложного формата, ориентированного на хранение вложенных структур данных (ага, еще надо бы xml_parse_ бенчмаркнуть). В реальных юзкейсах, скорее всего, не придется десятками мульйонов раз дергать эти функции, или колбасить ими big data, так что рассмотрение только в этом ключе - само по себе попахивает шизофрениней и экономией на спичках. С точки зрения удобства, INI выглядит более human readable / human editable, и позволяет безболезненно описывать структуры данных двойной вложенности, что в большинстве юзкейсов вполне приемлемо. Если на человечность формата, вообще плевать - можно использовать serialize() или посмотреть в сторону Bencode.

UbillingCache files vs memcached vs redis

Тестовый код:

set_time_limit(0);
$cache = new UbillingCache();
$cacheTime = 3600;
$iterations = 10000;
$testData = file_get_contents('api/libs/api.updates.php'); // ~20k of data
//testing cache set time
$testStartTime = time();
for ($i = 0; $i <= $iterations; $i++) {
    $cache->set('CACHE_BENCHMARK'.$i, $testData, $cacheTime);
}
$testEndTime = time();
$testResult = $testEndTime - $testStartTime;
$summary = __('Cache set results') . ': ' . $testResult . ' ' . __('sec.') . wf_tag('br');
 
//testing cache get time
$testStartTime = time();
for ($i = 0; $i <= $iterations; $i++) {
    $fromCache = $cache->get('CACHE_BENCHMARK'.$i);
}
$testEndTime = time();
$testResult = $testEndTime - $testStartTime;
$summary.=__('Cache get results') . ': ' . $testResult . ' ' . __('sec.'). wf_tag('br');
$summary.=__('Data transfered').': '. stg_convert_size((strlen($testData)*$iterations));
 
show_window(__('Test results'), $summary);

Результаты для files:

Cache set results: 11 сек.
Cache get results: 2 сек.
Data transfered: 187.43 Mb

Результаты для memcached:

Cache set results: 2 сек.
Cache get results: 2 сек.
Data transfered: 187.43 Mb

Результаты для redis:

Cache set results: 4 сек.
Cache get results: 3 сек.
Data transfered: 187.43 Mb

Итого наблюдаем, что для маленького объема данных, около 20Кб memcached работает слегка быстрее. А что будет, если сделать что-то типа

$testData = file_get_contents('api/libs/api.warehouse.php'); //~120k of data? 

А вот что.

Результаты для files:

Cache set results: 31 сек.
Cache get results: 27 сек.
Data transfered: 1.13 Gb

Результаты для memcached:

Cache set results: 61 сек.
Cache get results: 1 сек.
Data transfered: 1.13 Gb

Результаты для redis:

Cache set results: 11 сек.
Cache get results: 5 сек.
Data transfered: 1.13 Gb

Итого резюмируя - у memcached всегда быстрее время чтения данных из кэша, но медленнее на операциях set. При засовывании в кэш больших объемов данных, redis начинает серъезно доминировать. Осталось только определить, как часто вы будете работать с объемами больше гига.

labs.txt · Последние изменения: 2017/09/16 16:43 — nightfly
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki