Friday, October 17, 2008

Php, не все так плохо как кажется на первый взгляд.

   С полгода назад, пришлось реализовать для удобства IArrayAccess. И только после реализации решил замерить насколько оно медленнее массива, и запомнилась мне следующая удивительная цифра. Что то на 10.000 итераций Объект реализовавший IArrayAccess был медленнее на десяток секунд. (На не сильно слабой машине).


   Решил сегодня это печальное событие задокументировать с цифрами.  Результат приятно удивил.

Исходники
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:

 
Каталог сайтов, Добавить сайт