четверг, 28 октября 2010 г.

define vs const в php

Как известно, при разработке крупных веб приложений помимо архитектуры постоянно приходится задумываться так же и о производительности. Этим постом я хотел бы открыть серию постов по тестированию php на производительность.
Речь пойдет о сравнении способа хранения констант в приложении на php
А именно сравниваются два подхода:
define('CONST1', 'val11' );
define('CONST2', 'val12' );
define('CONST2', 'val13' );

и
class Consts{
 const CONST1 = 'val1';
 const CONST2 = 'val2';
 const CONST3 = 'val3';
}
 


В первом случае случае, вроде бы как должна использоваться специальная область памяти и такой способ уж если и не экономит память, так точно должен быть быстрее. Второй способ в некоторых случаях существенно удобнее. Так как позволяет не захламлять глобальную область видимости.
В общем чего думать и годать провел тесты.

Тест 1. Инициализация


Инициализируем 100 констант при помощи define
define('CACHER_TYPE_1', 'b60861c4492f88589429aab0c67abdd4' );
/*
      ...
   */
define('CACHER_TYPE_100', 'a66aedeafbc3f1e9fcbaa6a9e8060739' );


memory_start: 114.7578125Кб
time: 0.442981719971 ms
memory_finish: 120.8515625Кб
memory_diff: 6.09375Кб

$ab -n 1000 http://test/test/mem_class.php

Requests per second: 714.52 [#/sec] (mean)
Time per request: 1.400 [ms] (mean)


Теперь инициализируем через константы класса

class SlotType{
 const TYPE_CACHER_1 = 'b60861c4492f88589429aab0c67abdd4';
/*
      ...
   */
 const TYPE_CACHER_100 = 'a66aedeafbc3f1e9fcbaa6a9e8060739';
}

memory_start: 114.7578125Кб
time: 0.0340938568115 ms
memory_finish: 114.9921875Кб
memory_diff: 0.234375Кб

$ab -n 1000 http://test/test/mem_class.php

Requests per second: 818.27 [#/sec] (mean)
Time per request: 1.222 [ms] (mean)

Тест 2. Чтение


Считываем все константы определенные через define:
$var = CACHER_TYPE_1 . CACHER_TYPE_2 . /*...*/ . CACHER_TYPE_100;
time: 0.4 ms
memory_diff: 9.3Кб
ab -n1000:
Requests per second: 488.63 [#/sec] (mean)
Time per request: 2.047 [ms] (mean)

Считываем
$var = SlotType::TYPE_CACHER_1 . SlotType::TYPE_CACHER_2 . /*...*/ . SlotType::TYPE_CACHER_100;
time: 0.12 ms
memory_diff: 3.5Кб
ab -n1000:
Requests per second: 609.62 [#/sec] (mean)
Time per request: 1.640 [ms] (mean)

Вывод


Надо сказать, результат меня несколько удивил. Я ожидал, что по крайней мере скорость обработки с define будет выше. Оказывается Использование варианта
class Consts{
 const CONST1 = 'val1';
 const CONST2 = 'val2';
 const CONST3 = 'val3';
}
 

не только удобней, но и эффективней как по скорости исполнения, так и по расходу памяти.

1 комментарий: