С полгода назад, пришлось реализовать для удобства IArrayAccess. И только после реализации решил замерить насколько оно медленнее массива, и запомнилась мне следующая удивительная цифра. Что то на 10.000 итераций Объект реализовавший IArrayAccess был медленнее на десяток секунд. (На не сильно слабой машине).
Решил сегодня это печальное событие задокументировать с цифрами. Результат приятно удивил.
Исходники
array.php
spl-array.php
spl2-array.php
PHP 5.2.4-2ubuntu5.3 (2 ядра, системя с запущенными иксам, не сильно загружена)
Запуск через time php array.php
Среднее время выполнения - 1.6 секунды
Среднее время выполнения при включенном xcache - 1.3
На нашем прод сервере + apc = 0.5 секунды
Запуск через time php spl-array.php
Среднее время выполнения - 3.9 секунды
Среднее время выполнения при включенном xcache - 3.72
На нашем прод сервере + apc = 1.2 секунды
Запуск через time php spl2-array.php
Время выполнения 4.7 секунды
Среднее время выполнения при включенном xcache - 4.2
Выводы.
На 1.000.000 элементарных операций разница всего на 2-3 секунды. На моем ноуте.
Разница в полсекунды на прод сервере.
Для примера в zend framework по умолчанию порядка 2.000-4.000 таких и не очень элементарных вызовов.
В простейшей реализации страницы на limb
10.000 и выше. (за счет их любимых тулкитов).
Т.е. получается что для обычной страницы вы потеряете при активном использовании SPL IArrayAccess сотые доли секунды. Чем можно пренебрегать очень смело.
В итоге бояться использовать SPL я перестаю, хотя все равно на душе будет не спокойно.
Решил сегодня это печальное событие задокументировать с цифрами. Результат приятно удивил.
Исходники
array.php
error_reporting(E_ALL);
$array = array();
for ( $k = 1; $k < 10; $k++)
{
unset($array);
$array = array();
for ($i = 0 ; $i < 100000; $i++)
{
$array[$i] = $i + $k;
}
}
?>
spl-array.php
class SplArrayTest implements ArrayAccess
{
protected $_data;
public function __construct()
{
$this->_data = array();
}
public function offsetExists($offset)
{
return isset($this->_data[$offset]);
}
public function offsetGet($offset)
{
return $this->_data[$offset];
}
public function offsetSet($offset, $value)
{
$this->_data[$offset] = $value;
}
public function offsetUnset($offset)
{
unset($this->_data[$offset]);
}
public function __destruct()
{
unset($this->_data);
}
}
$array = new SplArrayTest();
for ( $k = 1; $k < 10; $k++)
{
unset($array);
$array = new SplArrayTest();
for ($i = 0 ; $i < 100000; $i++)
{
$array[$i] = $i + $k;
}
}
?>
spl2-array.php
class SplArrayTest implements ArrayAccess
{
public function __construct()
{
}
public function offsetExists($offset)
{
return isset($this->$offset);
}
public function offsetGet($offset)
{
return $this->$offset;
}
public function offsetSet($offset, $value)
{
$this->$offset = $value;
}
public function offsetUnset($offset)
{
$this->$offset;
}
public function __destruct()
{
}
}
$array = new SplArrayTest();
for ( $k = 1; $k < 10; $k++)
{
unset($array);
$array = new SplArrayTest();
for ($i = 0 ; $i < 100000; $i++)
{
$array[$i] = $i + $k;
}
}
?>
PHP 5.2.4-2ubuntu5.3 (2 ядра, системя с запущенными иксам, не сильно загружена)
Запуск через time php array.php
Среднее время выполнения - 1.6 секунды
Среднее время выполнения при включенном xcache - 1.3
На нашем прод сервере + apc = 0.5 секунды
Запуск через time php spl-array.php
Среднее время выполнения - 3.9 секунды
Среднее время выполнения при включенном xcache - 3.72
На нашем прод сервере + apc = 1.2 секунды
Запуск через time php spl2-array.php
Время выполнения 4.7 секунды
Среднее время выполнения при включенном xcache - 4.2
Выводы.
На 1.000.000 элементарных операций разница всего на 2-3 секунды. На моем ноуте.
Разница в полсекунды на прод сервере.
Для примера в zend framework по умолчанию порядка 2.000-4.000 таких и не очень элементарных вызовов.
В простейшей реализации страницы на limb
10.000 и выше. (за счет их любимых тулкитов).
Т.е. получается что для обычной страницы вы потеряете при активном использовании SPL IArrayAccess сотые доли секунды. Чем можно пренебрегать очень смело.
В итоге бояться использовать SPL я перестаю, хотя все равно на душе будет не спокойно.
No comments:
Post a Comment