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

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


labs

Розбіжності

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

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

Порівняння попередніх версій Попередня ревізія
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 начинает серъезно доминировать. Осталось только определить, как часто вы будете работать с объемами больше гига.