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

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


labs

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Порівняння попередніх версій Попередня ревізія
Попередня ревізія
labs [2017/09/16 12:19]
labs [2023/06/16 10:07]
nightfly знищено
Рядок 1: Рядок 1:
 +====== Бенчмарки и всякое такое ======
  
 +===== parse_ini_string() vs json_decode() vs unserialize() performance =====
 +Ясно, что в реальном мире данные для парсинга, придется доставать чем-то вроде parse_ini_file() или file_get_contents() но накладные расходы на вызовы системных fopen()/fclose() в таком контексте, мы можем просто опустить, в силу их одинаковости.\\
 +
 +<code php>
 +/* 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
 +
 +</code>
 +
 +
 +
 +Итого делаем несложный вывод - json_decode таки самый медленный из этой троицы, в силу накладных расходов на парсинг более сложного формата, ориентированного на хранение вложенных структур данных (ага, еще надо бы xml_parse_ бенчмаркнуть). В реальных юзкейсах, скорее всего, не придется десятками мульйонов раз дергать эти функции, или колбасить ими big data, так что рассмотрение только в этом ключе - само по себе попахивает шизофрениней и экономией на спичках. С точки зрения удобства, INI выглядит более human readable / human editable, и позволяет безболезненно описывать структуры данных двойной вложенности, что в большинстве юзкейсов вполне приемлемо. Если на человечность формата, вообще плевать - можно использовать serialize() или посмотреть в сторону Bencode.
 +
 +===== UbillingCache files vs memcached vs redis =====
 +Тестовый код:
 +
 +<code php>
 +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);
 +</code>
 +
 +Результаты для 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 работает слегка быстрее. А что будет, если сделать что-то типа 
 +<code php>
 +$testData = file_get_contents('api/libs/api.warehouse.php'); //~120k of data? 
 +</code>
 +А вот что.\\
 +
 +Результаты для 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 начинает серъезно доминировать. Осталось только определить, как часто вы будете работать с объемами больше гига.