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';
}
В первом случае, вроде бы как должна использоваться специальная область памяти, и такой способ уж если и не экономит память, так точно должен быть быстрее. Второй способ в некоторых случаях существенно удобнее, так как позволяет не захламлять глобальную область видимости.
В общем, чтобы не гадать, я провел тесты.
Инициализируем 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:
$ 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:
$ ab -n 1000 http://test/test/mem_class.php
Requests per second: 818.27 [#/sec] (mean)
Time per request: **1.222** [ms] (mean)
Считываем все константы, определённые через 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';
}
не только удобнее, но и эффективнее как по скорости исполнения, так и по расходу памяти.