Обращение к массиву
Сегодня будет немного странный 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() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 100 000 | 1.247621 | 1.446282 | f1() | 0.198661 с. | 13.74 % |
2 | 100 000 | 1.250535 | 1.448183 | f1() | 0.197648 с. | 13.65 % |
3 | 100 000 | 1.249116 | 1.451035 | f1() | 0.201919 с. | 13.92 % |
4 | 100 000 | 1.245621 | 1.457405 | f1() | 0.211784 с. | 14.53 % |
5 | 100 000 | 1.242678 | 1.443696 | f1() | 0.201018 с. | 13.92 % |
6 | 100 000 | 1.250272 | 1.443653 | f1() | 0.193381 с. | 13.4 % |
7 | 100 000 | 1.258356 | 1.450491 | f1() | 0.192135 с. | 13.25 % |
8 | 100 000 | 1.255274 | 1.453763 | f1() | 0.198489 с. | 13.65 % |
9 | 100 000 | 1.245144 | 1.455513 | f1() | 0.210369 с. | 14.45 % |
Всего: 900 000 | 11.244617 | 13.050021 | f1() | 1.805404 с. | 13.83 % |
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 100 000 | 0.616173 | 0.744694 | f1() | 0.128521 с. | 17.26 % |
2 | 100 000 | 0.578141 | 0.728324 | f1() | 0.150183 с. | 20.62 % |
3 | 100 000 | 0.584322 | 0.769890 | f1() | 0.185568 с. | 24.1 % |
4 | 100 000 | 0.579222 | 0.735389 | f1() | 0.156167 с. | 21.24 % |
5 | 100 000 | 0.588303 | 0.772614 | f1() | 0.184311 с. | 23.86 % |
6 | 100 000 | 0.575465 | 0.726392 | f1() | 0.150927 с. | 20.78 % |
7 | 100 000 | 0.572118 | 0.751896 | f1() | 0.179778 с. | 23.91 % |
8 | 100 000 | 0.574558 | 0.731050 | f1() | 0.156492 с. | 21.41 % |
9 | 100 000 | 0.564564 | 0.736749 | f1() | 0.172185 с. | 23.37 % |
Всего: 900 000 | 5.232866 | 6.696999 | f1() | 1.464133 с. | 21.86 % |
Использовать временную переменную выгоднее, нежели обращаться к массиву напрямую!