2011-09-03

Сравнение различных методов вызова функций в PHP

Вызов статических методов классов — прекрасная альтернатива обычным функциям - и класс создавать не нужно и принципы объектно-ориентированного программирования не нарушаются. Однако, в реализации статических методов в PHP  есть несколько проблем - статические методы не всегда корректно наследуются, поэтому, чтобы нивелировать неудобства статических методов в PHP часто используют синглетоны - обертывают денимические методы статическими обертками.

Однако, создание синглетона операция довольно ресурсоёмкая — проверить создан ли экземпляр класса, создать экземпляр класса если он не создан, вызвать на нём нужный метод. Насколько это сказывается на бытродействии я и решил сегодня проверить.

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

Вот исходный код скрипта.

Результат работы скрипта представлен в таблице ниже:

generation_time 11.7576429844
php_version 5.3.2-1ubuntu4.9
Case try 1 try 2 try 3 try 4 middle
Same plain function called 10000 times 0.0166 0.0187 0.0183 0.0135 0.0168
Different plain functions called 10000 times 0.0163 0.0221 0.018 0.0163 0.0182
Same static method 10000 times 0.0193 0.0265 0.0206 0.0194 0.0214
Different static methods called 10000 times 0.0221 0.0283 0.0229 0.0229 0.024
Static methods of different classes called 10000 times 0.0236 0.0279 0.0251 0.0242 0.0252
Same dynamic method called 10000 times 0.0166 0.0193 0.0169 0.0169 0.0174
Different class methods called 10000 times 0.02 0.02 0.0202 0.02 0.02
Singleton method called 10000 times 0.0403 0.0446 0.0409 0.041 0.0417
Different singletons called 10000 times 0.0562 0.0631 0.0548 0.0572 0.0578

В тестовом скрипте, я сравнил обычные PHP функции, статические методы класса, обычные методы и методы синглетона.

Результаты тестирования показали, что вызов методов синглетона, примерно в два - четыре раза медленнее, чем вызов обычных методов, что, в принципе, меня порадовало — я ожидал, что будет хуже.

При этом выяснилось несколько дополнительных вещей: cтатические вызовы функций объявленных без модификатора "static" примерно в два раза медленнее, чем с ним, cтатические методы немного медленнее, чем динамические.

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

 

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

 

Для того чтобы каждый раз не представляться можно войти как зарегистрированный пользователь.

Имя*

разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться