Производительность метода экземпляра класса Singleton по сравнению с методом статического класса в PHP?

Меня интересует объективный анализ того, что более эффективно; вызов методов экземпляра одноэлементного класса или методов статического класса. Я уже видел это, поэтому я Я не ищу обсуждения разницы между ними или обсуждения того, что «лучше». Меня интересует только относительная производительность между ними. Заранее спасибо.

-Майк


person MikeSchinkel    schedule 05.08.2010    source источник
comment
К вашему сведению, я думаю, что здесь можно найти лучший общий ответ о том, почему предпочитают синглтон, а не статический класс. stackoverflow.com/questions/6829609/   -  person Marco Demaio    schedule 13.08.2011
comment
Этот пост на Stackoverflow дает отличные тесты для разных версий PHP и дает хороший ответ на вопрос.   -  person Simon East    schedule 02.05.2017


Ответы (5)


Проверьте эту диаграмму :)

alt text

взято из этой статьи

person Andreas Linden    schedule 05.08.2010
comment
Кто угодно может создавать красивые диаграммы. Без информации об используемой тестовой установке это бессмысленно. Вы могли бы хотя бы дать ссылку на то, откуда вы это взяли. - person Gordon; 06.08.2010
comment
Я только что добавил ссылку на статью - person Andreas Linden; 06.08.2010
comment
В качестве стороны, автор теста должен четко и ясно заявить, что он вызывает цикл каждый раз TestSingleton::getInstance(), в то время как в реальных приложениях случается, что экземпляры Singleton передаются в качестве аргументов методам класса (что является одним из преимуществ дизайна Singleton. по сравнению со статическим классом [stackoverflow.com/questions/6829609/), поэтому эти классы не будут вызывать каждый раз getInstance(), потому что они уже хранят ссылку на объект Singleton ... - person Marco Demaio; 13.08.2011
comment
... в любом случае, в реальных приложениях также верно и то, что по-прежнему существует много вызовов Singletons getInstance() без каких-либо ссылок, и если это так, то проведенный тест может быть хорошей симуляцией. Сложно сказать! Существуют также тесты, которые доказывают, что вызов static МЕДЛЕН, чем вызов метода в PHP stackoverflow.com/questions/1472721, но и в этом случае трудно сказать, что это зависит также от того, что делает приложение stackoverflow.com/questions/1472721/ - person Marco Demaio; 13.08.2011
comment
этот тест просто неправильный, профилирование php не так просто. В этом случае вам необходимо измерить потребление ЦП и памяти на стороне сервера. В общем случае вы также должны отслеживать продолжительность сценария и время начала первого выходного байта и время последнего выходного байта. Вы также знаете GC, и в зависимости от того, где происходит GC, он может изменять время. Измерение всего выполнения скрипта может обеспечить более точную оценку с учетом GC. Также иногда бывает быстрее статика, иногда быстрее синглтон, иногда быстрее создание новых экземпляров !. - person CoffeDeveloper; 16.04.2015

Не беспокойтесь об этом, если вы не вызываете их в жестком цикле (то есть без другого значимого кода, где накладные расходы на вызов значительны) тысячи или сотни тысяч раз. Разница, скорее всего, составит менее микросекунды, поэтому не стоит беспокоиться. Просто сделайте лучший архитектурный выбор ...

Premature optimization is the root of all evil...

Изменить: Всем проголосовавшим против, вот написанное мною сообщение в блоге, в котором описывается почему подобные сравнения производительности бесполезны.

person ircmaxell    schedule 05.08.2010
comment
+1, полностью согласен, с добавлением того, что, когда речь идет об упаковке ресурсов, которые могли или не могли быть созданы (потоки сокетов, соединение с базой данных и т. Д.), Дополнительные накладные расходы на метод instance() синглтона сводятся на нет, поскольку статические функции все равно придется проверить, существует ли ресурс, и при необходимости создать его. - person Wrikken; 06.08.2010
comment
-1: Не ответил на вопрос, вместо этого проповедовал. Вопрос связан с использованием в WordPress; должны ли плагины использовать статические классы для инкапсуляции хуков или экземпляров классов, так что да, это может быть тысячи раз или больше. В этом контексте нет необходимости в экземплярах, поэтому я выбрал статический, но некоторые из них остаются статическими, слишком медленными. Я не знал фактов, поэтому пришел сюда, чтобы найти ответ. Все еще не знаю ответа ... - person MikeSchinkel; 07.08.2010
comment
Я ответил на вопрос. Я сказал, не беспокойтесь об этом. Скорее всего, разница будет очень незначительной. Сделайте лучший архитектурный выбор. В любом случае это микрооптимизация, так что не беспокойтесь об этом ... - person ircmaxell; 07.08.2010
comment
И это не может быть академический вопрос? - person Chris Tonkinson; 14.01.2011
comment
@Mike использует Wordpress и беспокоится о производительности - это парадокс. ircmaxell дал вам самый разумный совет. Если вас действительно беспокоит производительность вашего кода, профилируйте приложение, чтобы узнать, где находятся узкие места, вместо того, чтобы просто предполагать, что они находятся там, где вы думаете. Академический x быстрее, чем y, не заставит ваш код работать быстрее. - person Gordon; 14.08.2011
comment
@Gordon, хорошая демонизация платформы, которую используют на порядки больше людей, чем любую другую ... - person MikeSchinkel; 03.05.2017

Прежде чем вы сможете вызвать метод экземпляра одноэлементного объекта шаблона, вам нужно сначала получить экземпляр, для чего требуется вызов статического метода:

SomeClass::getInstance()->myMethod();
// versus
SomeClass::myMethod();

Поэтому в первый раз, когда вам понадобится доступ к этому объекту в функции, вам нужно сначала вызвать статический метод. Поскольку вызовы функций никогда не бывают бесплатными, вам, вероятно, лучше сделать метод статическим.

person Ryan Tenney    schedule 05.08.2010

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

person Mark Baker    schedule 05.08.2010

Я немного опоздал с этим разговором, но, только что найдя вопрос, я решил, что брошу свои мысли на ринг для моего первого сообщения в SO.

В качестве быстрого эксперимента (после прочтения статьи, на которую ссылается zolex) я добавил третий тестовый пример к тестам, указанным в статье:

$inst = TestSingleton::getInstance();  
for($i=0;$i<$runs;$i++) $inst->test();

Конечно, результаты не были на 100% согласованными, но я обнаружил, что в большинстве случаев при выполнении 500 000 вызовов всеми тремя методами вышеуказанный метод выполнялся на 2-3 секунды быстрее, чем любой из двух других.

Хотя я всегда передергиваю, когда вижу цитату о «преждевременной оптимизации», в данном случае я думаю, что она попадает в самую точку. Разница в производительности в лучшем случае минимальна и обычно свидетельствует в пользу более разумного использования singleton.

person AndyM84    schedule 14.01.2011
comment
правда, но читайте мои комментарии в ответе zolex. Ваш тест имитирует приложения из реального мира, в которых объект singleton может быть передан в качестве аргумента другим методам класса (внедрение объекта). В этом случае класс хранит ссылку на объект Singleton и его не нужно вызывать каждый раз getIntance. Но тест zolex ВСЕ ЕЩЕ МОДЕЛИРУЕТ РЕАЛЬНЫЕ МИРОВЫЕ ПРИЛОЖЕНИЯ, где синглтоны getIntance вызываются повсюду в коде без сохранения первой ссылки (это даже не вариант при использовании разных классов синглтонов). Так что оба теста верны! Но сложно сказать, какая из них лучше имитирует реальные приложения. - person Marco Demaio; 13.08.2011
comment
Вероятно, было бы наиболее правильным сказать, что приложения реального мира будут представлять собой смесь двух подходов к использованию синглтона. В любом случае, на самом деле я хотел подчеркнуть, что синглтоны не так уж плохи, как они выглядят. - person AndyM84; 23.08.2011