момент Guide to Programming with Zend Framework by Cal Evans
Категория: / DEV Блог
/ PHP (LAMP)
Посмотрел начало книжечки php|architect’s Guide to Programming with Zend Framework by Cal Evans
Там товарищ Кал Еванс пишет:
>> It’s just that easy. Since we are storing the instance of Zend_Config_Ini the first time
>> we call getConfig() there is no performance penalty to making multiple calls.
Якобы вызов многоразовый вызов getConfig() вместо прямого обращения к объекту не отражается на производительности и не стоит
волновать по этому поводу. Спички конечно, но сишники бы затоптали точно.
Набросаем код теста подобного синглетона.
Результаты теста:
Видно, что в первом случае получение инстанса объекта, и дальнейшее обращение напрямую к экземпляру практически в два раза быстрее,
чем каждоразовое обращение к синглетону через getInstance().
П.С.: Порадовало название раздела книги "Super Secret Ninja Class: Globals.php" =)
Здесь можно скачать PDF версию книги php|architect’s Guide to Programming with Zend Framework.
Там товарищ Кал Еванс пишет:
>> It’s just that easy. Since we are storing the instance of Zend_Config_Ini the first time
>> we call getConfig() there is no performance penalty to making multiple calls.
Якобы вызов многоразовый вызов getConfig() вместо прямого обращения к объекту не отражается на производительности и не стоит
волновать по этому поводу. Спички конечно, но сишники бы затоптали точно.
Набросаем код теста подобного синглетона.
class test_class {
protected $index = 0;
public static $_instance;
public static function getInstance( ) { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; }
public static function destroy() { self::$_instance = null; }
public function run() { $this->index++; }
public function getIndex() { return $this->index; }
}
function test($count) {
echo "\nTesting for {$count} \n\n";
test_class::destroy();
// 1
$time = xdebug_time_index();
$test = test_class::getInstance();
for ($i=0; $i<$count; $i++) {
$test->run();
}
$time = xdebug_time_index() - $time;
printf("1) %.8f (%d) \n", $time, $test->getIndex());
// 2
test_class::destroy();
$time = xdebug_time_index();
for ($i=0; $i<$count; $i++) {
test_class::getInstance()->run();
}
$time = xdebug_time_index() - $time;
printf("2) %.8f (%d) \n", $time, test_class::getInstance()->getIndex());
}
test(10);
test(100);
Результаты теста:
Testing for 10
1) 0.00016785 (10)
2) 0.00012207 (10)
Testing for 100
1) 0.00054193 (100)
2) 0.00106192 (100)
Видно, что в первом случае получение инстанса объекта, и дальнейшее обращение напрямую к экземпляру практически в два раза быстрее,
чем каждоразовое обращение к синглетону через getInstance().
П.С.: Порадовало название раздела книги "Super Secret Ninja Class: Globals.php" =)
Здесь можно скачать PDF версию книги php|architect’s Guide to Programming with Zend Framework.
Этот тест всего лишь доказывает, что "there is no performance penalty to making multiple calls" неверно. Хотя в контексте примера автора - из двух обращений, конечно никакого пенальти нет.