Habr, WTF?
Хабр не устаёт меня удивлять всё снижающимся качеством статей и кода. Ну вот что это:
if(strpos($name, 'fetchRowBy') === 0) {
array_unshift($arguments, substr($name, 10));
return call_user_func_array(array($this, 'fetchRowBy'), $arguments);
}Ещё бы регулярное выражение использовал,
Комментарии 39
а что не так с strpos? это самая эффективная проверка
substr() менее эффективен
На самом деле — этот кусок был взят
Нафига тут HTML? :)
Не видишь разницу? :) Представь, что у тебя 10k раз это вызвалось, теперь разница заметна? :) Всякую фиговину в вебе надо представлять внутри ещё одного внешнего цикла, который создают пользователи.
Комментарий для Евгения Степанищева:
Надо проверить ;)
Люблю, блин, php. Можно на нём десять лет писать, и всё равно новая функциягде-нибудь вылезет.
$str = «fetchRowByName»;
$pref = «fetchRowBy»;
$preflen = strlen($pref);
(strpos($str, $pref) === 0) — 0.45 сек
(substr($str, 0, $preflen) == $pref) — 0.68 сек
(substr($str, 0, $preflen) === $pref) — 0.55 сек (! — хозяйке на заметку)
(substr_compare($str, $pref, 0, $preflen) == 0) — 0.84 сек
Ну вот, уже проверили :)
Неправильный метод тестирования. Нужно проверять два случая, а не один.
Неправильно проверили.
в тесте не учтен случай с длинными строками, не содержащими префикса ; )
Так мануалы надо читать :)
http://ez.no/fr/content/download/134087/85 … ce_php.pdf
Кстати.
Кроме всего прочего, надо всё это запустить несколько раз и подсчитать среднее.
$pref = «fetchRowBy»;
(strpos($str, $pref) === 0) — 0.67
(substr($str, 0, $preflen) === $pref) — 0.58
(substr_compare($str, $pref, 0, $preflen) == 0) — 0.82
Ещё
Версия PHP?
Видимо, Ilia Alshanetsky должен обновить свой документ.
Я бы использовал substr, и логичней и как показывает последний тест — побыстрей. Но скорость в таких случаях очень мизерная, ими можно принебречь на мелких проектах..
Пойду добавлять в http://kurapov.name/technology/web/php/php_speed/
Я мелкими проектами уже много лет не занимаюсь, так что со своей колокольни сужу. Ни и во framework'ах надо аккуратнее быть — неизвестно в каких проектах они будут использоваться.
Комментарий для Евгения Степанищева:
Выложигде-нибудь?
Комментарий дляdavid-m.livejournal.com:
Такого метода быть не может ;)
Может быть оно?
http://ilia.ws/files/frankfurt_perf.ppt
Полностью согласен. Это кстати общая тенденция большинства «geek»'ов, которую приходиться отучать, чтобы другие члены команды не страдали. Понапишут развёртавыемые циклы и функции по 1000 строк с названием «mtzv» и гадай потом что да как. Одна из главных целей в любом продукте — это лёгкость в поддержке, если код понятен, легко расширяем, значит направление верно. Из моего опыта в 90% случаях ботлнеками являются совсем другие вещи, чем мусоличть доли секунд при обработке миллиона операций.
Конечно, это всё относительно и дополнительные поблажки могут быть добавлены для малых проектов (команда
при 1m операций. Любой мэнеджер убил бы за такое. :)
По поводу железа… благо нынче он достаточно дешовое и тот же
Аренда хорошего сервера — это совсем уже другие деньги. Иногда, существенные, особенно, если арендуется не один сервер.
У меня тоже очень большой опыт устранения bottle necks, причём вполне успешный. Последние несколько лет я непрерывно, иногда в реальном времени занимался нагруженными и быстрорастущими проектами.
Это известный PDF Ilia Alshanetsky об оптимизации PHP, он его каждый год выпускает, в инете сотни копий.
Вообще, по моему опыту «спичечной» оптимизации
Так что,
Что касается последнего теста — вспоминаем специфику задачи. Там _всегда_ будут короткие строки.
Да я уже проверил. Зачем в вашем коде «$t =- microtime(true)»?
У PHP достаточно много слабых мест, по этой теме есть масса документов. Например, циклы достаточно медленные. С PHP 5.3.0 многое должно измениться.
Кстати, сколько прогонов перед усреднением вы делали?
Не совсем понятно причём тут «троллевский приём», ну да ладно… я просто высказывал свою точку зрения и делился своим опытом.
Я же расписал какой именно приём применён.
В смысле, зачем? Чтобы float получить.
Прогонял раз по несколько. Это на домашней машине, она ничем другим не занималась, так что результат был стабильным ± единички во втором знаке.
5.3 — да, скорей бы уж.
$t =- microtime(true);
…
$t += microtime(true);
Для красоты внешнего вида, исключительно:)