Создать массив php
Самый простой и действенный метод обработки данных в любом языке программирования является массив. В данном тесте мы разбирёмся как быстрее создать массив php.
Я стараюсь не использовать многомерные массивы в php с большой вложенностью, нет смысла городить лишние мерности - скорость обращения к ним падает. Я храню конфигурацию и меню в массивах и мне крайне важен момент насколько быстро создаётся массив. Потестим так называемые автомассивы $a[]=''; индексные $a[9]=''; и структурная сборка массива $a=array('ключ'=>'значение',..); Сразу скажу что именные массивы мы тестить не будем поскольку это путь к перебору массива через foreach, прогоны по ключам бывают неоднократными, что убивает всю затею на корню (не верьте наслово - проверяйте сами :).
Индексные массивы vs автомассивы
Для начала разбирёмся какой массив быстрее собирётся - через указание следующего элемента или отдачи на откуп php.
function f1(){ $i=0; while($i<LOOP){ $a=array(); $a[]=array('typ'=>'top', 'active'=>'yes',...; .. $a[]=array('typ'=>'top', 'active'=>'yes',...;//40 ++$i; } } function f2(){ $i=0; while($i<LOOP){ $a=array(); $a[0]=array('typ'=>'top', 'active'=>'yes',...; .. $a[40]=array('typ'=>'top', 'active'=>'yes',...; ++$i; } }Компьютер:
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 1 | 0.000209 | 0.000113 | f2() | 0.000096 с. | 45.89 % |
2 | 1 | 0.000108 | 0.000109 | f1() | 0.000001 с. | 0.88 % |
3 | 1 | 0.000108 | 0.000108 | f2() | 0.000000 с. | 0 % |
4 | 1 | 0.000106 | 0.000110 | f1() | 0.000004 с. | 3.47 % |
5 | 1 | 0.000106 | 0.000107 | f1() | 0.000001 с. | 1.11 % |
6 | 1 | 0.000105 | 0.000106 | f1() | 0.000001 с. | 1.12 % |
7 | 1 | 0.000104 | 0.000105 | f1() | 0.000001 с. | 0.91 % |
8 | 1 | 0.000104 | 0.000108 | f1() | 0.000004 с. | 3.75 % |
9 | 1 | 0.000105 | 0.000105 | f2() | 0.000000 с. | 0.23 % |
Всего: 9 | 0.001055 | 0.000971 | f2() | 0.000084 с. | 7.96 % |
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 1 | 0.000208 | 0.000098 | f2() | 0.000110 с. | 52.92 % |
2 | 1 | 0.000090 | 0.000092 | f1() | 0.000002 с. | 2.07 % |
3 | 1 | 0.000091 | 0.000104 | f1() | 0.000013 с. | 12.81 % |
4 | 1 | 0.000091 | 0.000092 | f1() | 0.000001 с. | 1.3 % |
5 | 1 | 0.000090 | 0.000092 | f1() | 0.000002 с. | 2.07 % |
6 | 1 | 0.000089 | 0.000092 | f1() | 0.000003 с. | 3.37 % |
7 | 1 | 0.000092 | 0.000090 | f2() | 0.000002 с. | 2.33 % |
8 | 1 | 0.000094 | 0.000094 | f1() | 0.000000 с. | 0.25 % |
9 | 1 | 0.000091 | 0.000090 | f2() | 0.000001 с. | 1.31 % |
Всего: 9 | 0.000936 | 0.000844 | f2() | 0.000092 с. | 9.81 % |
Как видим, повторный запуск создания массива происходит быстрей. т.е. срабатывают какие-то внутренние механизмы оптимизации, либо просто память не перераспределяется, а идёт по тем же блокам..
Сборка php массива через конструкцию array() vs через ключ
Узким местом движка является файл с меню, представляющий собой многомерный массив, мне крайне важен именно этот момент.
function f1(){ $i=0; while($i<LOOP){ $a=array(); $a[0]=array('typ'=>'top', 'active'=>'yes',...; .. $a[40]=array('typ'=>'top', 'active'=>'yes',...; ++$i; } } function f2(){ $i=0; while($i<LOOP){ $a=array(); $a=array( 0=>array('typ'=>'top', 'active'=>'yes',... .. 40=>array('typ'=>'top', 'active'=>'yes',..., ); ++$i; } }Компьютер:
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 1 | 0.000229 | 0.000109 | f2() | 0.000120 с. | 52.4 % |
2 | 1 | 0.000109 | 0.000103 | f2() | 0.000006 с. | 5.47 % |
3 | 1 | 0.000109 | 0.000101 | f2() | 0.000008 с. | 7.22 % |
4 | 1 | 0.000105 | 0.000102 | f2() | 0.000003 с. | 2.95 % |
5 | 1 | 0.000106 | 0.000102 | f2() | 0.000004 с. | 4.04 % |
6 | 1 | 0.000109 | 0.000104 | f2() | 0.000005 с. | 4.6 % |
7 | 1 | 0.000109 | 0.000102 | f2() | 0.000007 с. | 6.35 % |
8 | 1 | 0.000107 | 0.000104 | f2() | 0.000003 с. | 2.68 % |
9 | 1 | 0.000107 | 0.000102 | f2() | 0.000005 с. | 4.9 % |
Всего: 9 | 0.001090 | 0.000929 | f2() | 0.000161 с. | 14.79 % |
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 1 | 0.000212 | 0.000100 | f2() | 0.000112 с. | 52.81 % |
2 | 1 | 0.000094 | 0.000088 | f2() | 0.000006 с. | 6.35 % |
3 | 1 | 0.000092 | 0.000089 | f2() | 0.000003 с. | 3.37 % |
4 | 1 | 0.000094 | 0.000095 | f1() | 0.000001 с. | 1.01 % |
5 | 1 | 0.000092 | 0.000090 | f2() | 0.000002 с. | 2.07 % |
6 | 1 | 0.000093 | 0.000088 | f2() | 0.000005 с. | 5.63 % |
7 | 1 | 0.000099 | 0.000088 | f2() | 0.000011 с. | 11.08 % |
8 | 1 | 0.000092 | 0.000091 | f2() | 0.000001 с. | 1.04 % |
9 | 1 | 0.000101 | 0.000090 | f2() | 0.000011 с. | 11.08 % |
Всего: 9 | 0.000969 | 0.000819 | f2() | 0.000150 с. | 15.52 % |
Создание php массива через автомассив vs через ключ
На заметку: с PHP 5.4 возможно использовать короткий синтаксис [] вместо array(). Уменьшение числа символов = увеличение скорости парсинга. На этот раз чистый тест, без повторов - запускаю скрипт по 3 раза.
function f1(){ $i=0; while($i<LOOP){ $a=[ ['bottom','yes',false,'main','Главная','','','','','_self',''] ... ,['bottom','yes',false,'search','Поиск','','','','','_self',''] ]; ++$i; } } function f2(){ $i=0; while($i<LOOP){ $a=[ 0=>[0=>'bottom',1=>'yes',2=>false,3=>'main',4=>'Главная',5=>'',6=>'',7=>'',8=>'',9=>'_self',10=>''] ... ,75=>[0=>'bottom',1=>'yes',2=>false,3=>'search',4=>'Поиск',5=>'',6=>'',7=>'',8=>'',9=>'_self',10=>''] ]; ++$i; } }Компьютер:
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 1 | 0.000304 | 0.000218 | f2() | 0.000086 с. | 28.31 % |
2 | 1 | 0.000354 | 0.000223 | f2() | 0.000131 с. | 37.04 % |
3 | 1 | 0.000307 | 0.000215 | f2() | 0.000092 с. | 29.97 % |
Всего: 3 | 0.000965 | 0.000656 | f2() | 0.000309 с. | 31.77 % |
№ | вызовов | время f1() | время f2() | победил | быстрее на | |
---|---|---|---|---|---|---|
1 | 1 | 0.000409 | 0.000212 | f2() | 0.000197 с. | 48.19 % |
2 | 1 | 0.000462 | 0.000171 | f2() | 0.000291 с. | 63 % |
3 | 1 | 0.000354 | 0.000187 | f2() | 0.000167 с. | 47.21 % |
Всего: 3 | 0.001225 | 0.00057 | f2() | 0.000655 с. | 52.8 % |
PHP массивы с явным указанием индекса рулят.