Fast Site Engine
Высокопроизводительный движок для сайтов
Заказать сайт на основе движка
О движкеПроизводительностьБезопасностьТехнические требованияSEO 
Лицензионное соглашение
Демо
Установка
Панель управления
Модули
Документация
Шаблоны
Тесты производительности php
Планы на будущее
Список изменений
Отзывы и пожелания
Переходим на Линукс
Всякое разное
Тесты производительности php  »  Создать массив

Создать массив 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;
  }
}
Компьютер:
вызововвpемя f1()вpемя f2()выигралбыстрее на
110.0002090.000113f2()0.000096 с.45.89 %
210.0001080.000109f1()0.000001 с.0.88 %
310.0001080.000108f2()0.000000 с.0 %
410.0001060.000110f1()0.000004 с.3.47 %
510.0001060.000107f1()0.000001 с.1.11 %
610.0001050.000106f1()0.000001 с.1.12 %
710.0001040.000105f1()0.000001 с.0.91 %
810.0001040.000108f1()0.000004 с.3.75 %
910.0001050.000105f2()0.000000 с.0.23 %
Всего: 90.0010550.000971f2()0.000084 с.7.96 %
Сервер:
вызововвpемя f1()вpемя f2()выигралбыстрее на
110.0002080.000098f2()0.000110 с.52.92 %
210.0000900.000092f1()0.000002 с.2.07 %
310.0000910.000104f1()0.000013 с.12.81 %
410.0000910.000092f1()0.000001 с.1.3 %
510.0000900.000092f1()0.000002 с.2.07 %
610.0000890.000092f1()0.000003 с.3.37 %
710.0000920.000090f2()0.000002 с.2.33 %
810.0000940.000094f1()0.000000 с.0.25 %
910.0000910.000090f2()0.000001 с.1.31 %
Всего: 90.0009360.000844f2()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;
  }
}
Компьютер:
вызововвpемя f1()вpемя f2()выигралбыстрее на
110.0002290.000109f2()0.000120 с.52.4 %
210.0001090.000103f2()0.000006 с.5.47 %
310.0001090.000101f2()0.000008 с.7.22 %
410.0001050.000102f2()0.000003 с.2.95 %
510.0001060.000102f2()0.000004 с.4.04 %
610.0001090.000104f2()0.000005 с.4.6 %
710.0001090.000102f2()0.000007 с.6.35 %
810.0001070.000104f2()0.000003 с.2.68 %
910.0001070.000102f2()0.000005 с.4.9 %
Всего: 90.0010900.000929f2()0.000161 с.14.79 %
Сервер:
вызововвpемя f1()вpемя f2()выигралбыстрее на
110.0002120.000100f2()0.000112 с.52.81 %
210.0000940.000088f2()0.000006 с.6.35 %
310.0000920.000089f2()0.000003 с.3.37 %
410.0000940.000095f1()0.000001 с.1.01 %
510.0000920.000090f2()0.000002 с.2.07 %
610.0000930.000088f2()0.000005 с.5.63 %
710.0000990.000088f2()0.000011 с.11.08 %
810.0000920.000091f2()0.000001 с.1.04 %
910.0001010.000090f2()0.000011 с.11.08 %
Всего: 90.0009690.000819f2()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;
  }
}
Компьютер:
вызововвpемя f1()вpемя f2()выигралбыстрее на
110.0003040.000218f2()0.000086 с.28.31 %
210.0003540.000223f2()0.000131 с.37.04 %
310.0003070.000215f2()0.000092 с.29.97 %
Всего: 30.0009650.000656f2()0.000309 с.31.77 %
Сервер:
вызововвpемя f1()вpемя f2()выигралбыстрее на
110.0004090.000212f2()0.000197 с.48.19 %
210.0004620.000171f2()0.000291 с.63 %
310.0003540.000187f2()0.000167 с.47.21 %
Всего: 30.0012250.00057f2()0.000655 с.52.8 %

PHP массивы с явным указанием индекса рулят.

Страница сгенерирована за 0.001517 секунды
На один процесс веб-сервера: 659 стр/сек.
Всего Apache может отдать: 168 704 стр/сек.
Выделено php памяти: 864.12 KB, real_usage: 2 MB

© Все права защищены 2004 - 2018
Карта сайта
Отслеживать изменения в Твиттере
Политика конфиденциальности

Браузер построил за сек.
Полное время сек.

С момента выгрузки предыдущей страницы из памяти браузера: сек.