Опитимизация call_user_func_array

Adelf

Administrator
Команда форума
А вообще если ктонибудь типа Рыжикова был бы главным у Коханы(и она не была бы opensource) он пиарился бы примерно так после добавления этого метода: "Мы значительно оптимизировали методы работы с базой данных! В некоторых случаях скорость увеличилась в два-три раза! Ваши приложения под Коханой будут работать в разы быстрее." и т.д.
Помню сколько было таких базаров, после того как Битрикс смогли заставить работать с UTF-8 :)
 

atv

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

Второе, если метод вызывается много раз в рамках одного запуска приложения (да и в рамках количества запросов в единицу времени), то наносекунды складываются в секунды.

Тут нужно оценивать исходя из общих затрат времени на выполнение данного метода. Если он занимает 20% времени выполнения приложения, и его удалось оптимизировать на 50%, то это означает, что приложение стало работать на 10% быстрее. Т.е. приложение сможет обрабатывать на 10% запросов больше в единицу времени.

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

Что касается жертв в читабельности, то в данном случае, это не самый худший вариант. В LightOrm мне приходилось жертвовать даже объектным подходом. НО! Нужно помнить, что такие жертвы должны приноситься в строго определённых местах, выявленных по замерам производительности. Т.е. в оптимизации нет жёстких правил (как обычно её пытаются представить, заменой двойных кавычек на одинарные). Оптимизация проводится только после замеров и только там где это может оказаться оправданным (не всегда удаётся оптимизировать даже то, что нужно).
 

zerkms

TDD infected
Команда форума
Этот вопрос сильно зависит от контекста. Если код относится к повторно используемому, то оптимизация вредной не бывает, так как это вклад во все проекты, с использованием этого кода.

Второе, если метод вызывается много раз в рамках одного запуска приложения (да и в рамках количества запросов в единицу времени), то наносекунды складываются в секунды.
я ждал этого комментария!
вот atv нам сейчас и измерит разницу :)
 

atv

Новичок
вот atv нам сейчас и измерит разницу :)
Честно говоря, не понимаю, чего ты от меня ожидаешь.

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

Ключевая фраза моего поста: "Оптимизация проводится только после замеров и только там где это может оказаться оправданным"

P.S. Кстати, оптимизацию оценивают в процентах потому, что абсолютное время не имеет большого значения. К тому же, абсолютное время, при замере производительности, сильно увеличивается, из-за самого процесса сбора информации о производительности.

P.P.S Вредной бывает только преждевременная оптимизация (т.е. до замеров производительности). Это не относится к оптимизации высокоуровневых алгоритмов, которая может проводиться ещё на стадии проектирования.
 

zerkms

TDD infected
Команда форума
Только хотел указать, что однозначного ответа дать практически невозможно, без замеров производительности.
это касаемо сферического коня в вакууме. у нас есть код. чего бы его не измерить? :)

про "относительных" - я там опечатался, там должно быть "абсолютных". с относительными фраза вообще какой бы то ни было смысл теряет.
 

atv

Новичок
у нас есть код. чего бы его не измерить? :)
Меня не волнует конкретно этот случай оптимизации. Вопрос о том, говнокод это или нет, меня не задевает :)

Что касается "измерить", то ты забываешь что измерения должны проводиться на реальном приложении. Если вес (количество вызовов на собственное время) этого метода небольшой, то и оптимизировать его нет смысла.

Встречный вопрос, ты занимался оптимизацией производительности кода в mzz?
 

atv

Новичок
приберегаю на сладенькое :)
Вообще, процесс очень интересный. Но главное задаться конкретной целью, т.е. достичь определённого уровня производительности. Например, возьми самое простое приложение и замерь количество запросов, которое оно выдерживает. Потом задайся целью, увеличить количество запросов вдвое. Получишь невероятный опыт и удовольствие :)

Я, когда первые разы занимался оптимизацией, не имел чёткой цели, и практически ничего не смог оптимизировать. Когда я поставил себе цель догнать и обогнать Propel (в случае с LightOrm), то начал выискивать и находить много способов улучшить производительность. Правда, на селектах так и не удалось догнать, всё-таки, Propel это генерируемая ORM-ка.
 

zerkms

TDD infected
Команда форума
потратил примерно час времени и знатно пофлудил на канале коханы с девелоперами. они серьёзно этот код запостили как перформанс оптимизацию. они серьёзно считают, что 100% выйгрыша - это серьёзный аргумент для такого говнокода. и им совершенно наплевать, что эти 100% в абсолютном выражении равняются ~0.00001с (измерено на типичном кохановском проекте).
мотивируют это тем, что "а десяток старушек - уже рубль". т.е. 10000 запросов это уже секунда, и совсем не слушают, что кроме этой 10^-5 есть ещё другая логика, которая на 10000 запросах из 0.01 превратится в 100сек.
 

atv

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

zerkms

TDD infected
Команда форума
atv
в том то и дело - что даже сейчас они считают, что всё окейно, и что такая конструкция стоит озвученных 100% прироста ))
 

tf

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

fixxxer

К.О.
Партнер клуба
тред не читал, но это какая-то полная херня а не оптимизация. любой вызов функции/метода внутри php реализуется через тот же call_user_func.

авторам этого кода предлагается либо вкурить сорцы php либо пройти курс профилактической лоботомии
 

zerkms

TDD infected
Команда форума
тред не читал, но это какая-то полная херня а не оптимизация. любой вызов функции/метода внутри php реализуется через тот же call_user_func.
ээээээээээ....... можно пруф?

по факту - call_user_func_array на деле оказывается и вправду примерно раза в 2-3 медленнее вызова с переменным именем метода.
 

fixxxer

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

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

-~{}~ 16.09.09 05:18:

$ time php -r 'class A{function z(){}} for($i=0;$i<1000;++$i) A::z();'
0.12 real 0.10 user 0.02 sys
$ time php -r 'class A{function z(){}} for($i=0;$i<1000;++$i) call_user_func_array(array("A","z"),array());'
0.13 real 0.12 user 0.00 sys

апупеть. :)
 

zerkms

TDD infected
Команда форума
fixxxer
ну я тоже померил на реальном проекте. разница получилась 1*10^-5с (это с 6 вызовами этого метода)
:)

на что они ответили: если есть хоть немного но более быстрый вариант - зачем откатываться на более медленный?
 

fixxxer

К.О.
Партнер клуба
ну как бы все с ними ясно, чо :)

заносим в записную книжку: фреймворк kohana пишут упоротые. :)

-~{}~ 16.09.09 05:34:

или там ваще на каждый пук такое делается? ну это тогда говорит о ПРОФФЕСЕАНАЛЬНО ПРАДУМАНОЙ АРХЕТЕКТУРЕ

-~{}~ 16.09.09 05:35:

[x]
 

zerkms

TDD infected
Команда форума
не на каждый пук, в том-то и дело. в остальном там код довольно добротный.
 

zerkms

TDD infected
Команда форума
флоппик
просто разовое массовое помешательство, вестимо ))

ps: после того как я попоносил их код они решили, что я засланец из cake. только хз, шутили они или нет %)
 
Сверху