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

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


labs

Розбіжності

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

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

Порівняння попередніх версій Попередня ревізія
Наступна ревізія По сторонах наступні версії
labs [2017/09/16 12:19]
labs [2022/09/24 14:39]
127.0.0.1 зовнішнє редагування
Рядок 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 начинает серъезно доминировать. Осталось только определить, как часто вы будете работать с объемами больше гига.