Fast Site Engine

Высокопроизводительная CMS для сайтов.

Сделать сайт

Карта сайта
Переходим на Линукс
Политика конфиденциальности
Сделать сайт на основе Fast Site Engine

Установка
Документация
Список изменений
Лицензионное соглашение

Скачать
О движкеПроизводительностьБезопасностьТехнические требованияSEOКонтакты

Обращение к массиву

Сегодня будет немного странный php тест про обращение к массиву, мучает вопрос: насколько просаживает производительность выделение временной переменной при обращении к элементу массива. Т.е. Что быстрее обращаться к элементу напрямую как $array[x][y] или выделять временный буфер $a=$array[x] и обращаться в более читабельной форме $a[y], заодно сокращая объём кода, как мы уже знаем чем больше - тем медленней переваривает компилятор..

Тесты PHP проводились на двух конфигурациях

Компьютер:
  Apache/2.4.34 PHP 7.2.10
  Linux version 4.15.0-45-generic (Kubuntu 18.04.2 LTS (Bionic Beaver) x86_64)
  12 x AMD Ryzen 5 1600X @ 3.70GHz
Сервер:
  Apache/2.4.38 PHP 7.2.15
  Linux version 2.6.32-042stab127.2 (Red Hat 4.4.6-4) (CENTOS 6.10 x86_64)
  4 x Intel(R) Xeon(R) CPU E5-1650 v3 @ 3.50GHz

Функции тестирования

Взял меню данного сайта и на его основе буду гонять функции, это 74 пункта двухмерного массива в виде:

$menu=[
...
74=>['typ'=>'left','active'=>'yes','lnk'=>false,'name'=>'php-array','text'=>'Обращение к массиву','hint'=>'','par1'=>'speed','par2'=>'','par3'=>'','target'=>'_self','title'=>'']];
define('LOOP',100);
function f1(){
  global $menu;
  $i=0;while(++$i<LOOP){
    for($x=0;$x<75;$x++){
      $r=$menu[$x];
      if('left'==$r['typ'] && 'yes'==$r['active'] && false==$r['lnk'] && 'php-array'==$r['name'] && 'speed'==$r['par1'] && ''==$r['par2'] && ''==$r['par3'] && '_self'==$r['target']){}
    }
  }
}
function f2(){
  global $menu;
  $i=0;while(++$i<LOOP){
    for($x=0;$x<75;$x++){
      if('left'==$menu[$x]['typ'] && 'yes'==$menu[$x]['active'] && false==$menu[$x]['lnk'] && 'php-array'==$menu[$x]['name'] && 'speed'==$menu[$x]['par1'] && ''==$menu[$x]['par2'] && ''==$menu[$x]['par3'] && '_self'==$menu[$x]['target']){}
    }
  }
}

Результаты тестирования

Компьютер:
вызововвремя f1()время f2()победилбыстрее на
1100 0001.2476211.446282f1()0.198661 с.13.74 %
2100 0001.2505351.448183f1()0.197648 с.13.65 %
3100 0001.2491161.451035f1()0.201919 с.13.92 %
4100 0001.2456211.457405f1()0.211784 с.14.53 %
5100 0001.2426781.443696f1()0.201018 с.13.92 %
6100 0001.2502721.443653f1()0.193381 с.13.4 %
7100 0001.2583561.450491f1()0.192135 с.13.25 %
8100 0001.2552741.453763f1()0.198489 с.13.65 %
9100 0001.2451441.455513f1()0.210369 с.14.45 %
Всего: 900 00011.24461713.050021f1()1.805404 с.13.83 %
Сервер:
вызововвремя f1()время f2()победилбыстрее на
1100 0000.6161730.744694f1()0.128521 с.17.26 %
2100 0000.5781410.728324f1()0.150183 с.20.62 %
3100 0000.5843220.769890f1()0.185568 с.24.1 %
4100 0000.5792220.735389f1()0.156167 с.21.24 %
5100 0000.5883030.772614f1()0.184311 с.23.86 %
6100 0000.5754650.726392f1()0.150927 с.20.78 %
7100 0000.5721180.751896f1()0.179778 с.23.91 %
8100 0000.5745580.731050f1()0.156492 с.21.41 %
9100 0000.5645640.736749f1()0.172185 с.23.37 %
Всего: 900 0005.2328666.696999f1()1.464133 с.21.86 %

Использовать временную переменную выгоднее, нежели обращаться к массиву напрямую!



© Все права защищены 2004 - 2024