Сравнение производительности методов выбора элементов из массива 25.08.2010
Во время профилирования php кода часто «всплывают» функции вызываемые несколько тысяч раз за время выполнения одного сценария. Такие функции необходимо жестко оптимизировать, так как потерянная миллисекунда выливается в итоге в секунду. Одной из частых ошибок встречаемых мной в различных программах является получения элемента массива, наличие которого неизвестно. Тут распространены несколько методов:
-
-
// Method 1
-
$a = @$array['asdfsdfsdfsdf'];
-
// Method 2
-
$a = null;
-
if (($array['asdfsdfsdfsdf'])){
-
$a = $array['asdfsdfsdfsdf'];
-
}
-
// Method 3
-
$a = null;
-
if (('asdfsdfsdfsdf', $array)){
-
$a = $array['asdfsdfsdfsdf'];
-
}
-
Я провел небольшое тестирование с целью выяснить, какой метод самый быстрый.
Для этого я написал вот такой тест
-
-
<?php
-
$empty = ();
-
-
$t = (true);
-
for($i = 1; $i <= 1000000; $i++){
-
$a = @ $empty[$i];
-
}
-
("@ — " . ((true) — $t) . PHP_EOL) ;
-
-
-
$t = (true);
-
for($i = 1; $i <= 1000000; $i++){
-
if (($empty[$i])){
-
$a = $empty[$i];
-
} else {
-
$a = null;
-
}
-
}
-
-
("isset (if expand) — " . ((true) — $t) . PHP_EOL) ;
-
-
-
$t = (true);
-
for($i = 1; $i <= 1000000; $i++){
-
$a = ($empty[$i]) ? $empty[$i] : null;
-
}
-
-
("isset (?:) — " . ((true) — $t) . PHP_EOL) ;
-
-
$t = (true);
-
for($i = 1; $i <= 1000000; $i++){
-
if (($i, $empty)){
-
$a = $empty[$i];
-
} else {
-
$a = null;
-
}
-
}
-
-
("array_key_exists — " . ((true) — $t) . PHP_EOL) ;
-
Результаты такие:
| @ | 2.9017329216003 |
| isset (if expand) | 0.57358312606812 |
| isset (?:) | 0.51982712745667 |
| array_key_exists | 3.554811000824 |
На первом месте по скорости конструкция isset в записанная в краткой форме условия. Не очень читабельно, зато быстро. На втором все тот же isset, только в развернутой форме
На третьем месте блокирование ошибок с помощью @ с почти что 6-кратным отставанием. Очень плохой способ, так как помимо всего в error_handler будут прилетать сообщения об ошибках, которые он должен будет обрабатывать, что снизит производительность еще более
На последнем месте array_key_exists, его использование имеет смысл только в одном случае, если нужно достоверно убедиться, что элемент с таким индексом существует, даже если в нем записан null
Похожие статьи
- Паттерн проектирования Прокси (Proxy) на PHP
- Вышел PHP 5.4a1
- Как закрыть соединение и продолжить выполнение скрипта
- Встроенный Web сервер в PHP
- Вышел NetBeans 7 Beta 2
