Користувальницькькі налаштування

Налаштування сайту


Сайдбар

Розділи

Загальний опис
Історія змін
Рекомендації щодо оновлення
Плани на майбутнє
Відомі проблеми
Онлайн демо
Люди
Трохи про безпеку

FAQ



Редагувати сайдбар

labs

Це стара версія документу!


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

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.1664019551.txt.gz · Востаннє змінено: 2022/09/24 14:39 повз 127.0.0.1