SJ Hook Profiler
В погоне за микросекундами
Разработчики плагинов WordPress и bbPress используют две функции для расширения функциональности WordPress/bbPress: это add_action() и add_filter(). Первая служит для установки обработчика некоторого события, вторая — для установки фильтра. Под хуком подразумевается обобщённое понятие (либо фильтр, либо обработчик).
Как показывает практика, большая часть времени генерации страницы уходит именно на вызов обработчиков и фильтров. И когда возникает вопрос: почему время генерации страницы такое большое, а запроса всего три, и они выполняются за сотые доли секунды, на помощь приходит данный плагин.
В отличие от WP Tuner, которому явно нужно указывать, какие события нужно профилировать, SJ Hook Profiler автоматически определяет все используемые хуки и устанавливает обработчики, измеряющие их время работы. На выходе получается что-то вида данной таблицы:
| Hook Name | Total Time | Invocations | Average Time |
|---|---|---|---|
| pre_option_gmt_offset | 0.000169 | 1 | 0.000169 |
| option_blog_charset | 0.000405 | 11 | 0.000037 |
| plugins_loaded | 0.014295 | 1 | 0.014295 |
| option_siteurl | 0.000810 | 26 | 0.000031 |
| option_home | 0.004852 | 160 | 0.000030 |
| sanitize_comment_cookies | 0.000117 | 1 | 0.000117 |
| option_category_base | 0.000029 | 1 | 0.000029 |
| option_tag_base | 0.000027 | 1 | 0.000027 |
| setup_theme | 0.000030 | 1 | 0.000030 |
| wp_default_scripts | 0.001951 | 1 | 0.001951 |
| set_current_user | 0.000114 | 1 | 0.000114 |
| init | 0.011603 | 1 | 0.011603 |
| widgets_init | 0.003384 | 1 | 0.003384 |
| wp_default_styles | 0.000349 | 1 | 0.000349 |
| query_vars | 0.000036 | 1 | 0.000036 |
| sanitize_title | 0.001518 | 17 | 0.000089 |
| posts_where | 0.000033 | 1 | 0.000033 |
| the_posts | 0.000127 | 1 | 0.000127 |
| template_redirect | 0.000541 | 1 | 0.000541 |
| bloginfo | 0.002297 | 8 | 0.000287 |
| term_name | 0.000621 | 2 | 0.000310 |
| term_description | 0.000982 | 2 | 0.000491 |
| single_post_title | 0.000468 | 2 | 0.000234 |
| wp_title | 0.000747 | 2 | 0.000373 |
| wp_head | 0.020773 | 1 | 0.020773 |
| comments_open | 0.000373 | 4 | 0.000093 |
| the_title | 0.011747 | 46 | 0.000255 |
| wp_print_styles | 0.000175 | 2 | 0.000088 |
| style_loader_src | 0.000330 | 9 | 0.000037 |
| wp_print_scripts | 0.000440 | 1 | 0.000440 |
| print_scripts_array | 0.000050 | 1 | 0.000050 |
| wp_list_pages | 0.000305 | 1 | 0.000305 |
| the_author | 0.000534 | 2 | 0.000267 |
| the_content | 1.004469 | 1 | 1.004469 |
| comment_text | 0.001105 | 1 | 0.001105 |
| pings_open | 0.000087 | 1 | 0.000087 |
| comment_form | 0.007084 | 1 | 0.007084 |
| widget_title | 0.001137 | 4 | 0.000284 |
| list_cats | 0.004768 | 22 | 0.000217 |
| wp_footer | 0.009798 | 1 | 0.009798 |
| wp_print_footer_scripts | 0.000115 | 1 | 0.000115 |
Из таблицы видно, что слабое место — это вызов фильтра the_content (вызов более одной секунды), и копать нужно именно в сторону оптимизации фильтров the_content. Пока не поддерживается профилирование каждого обработчика (то есть делаются замеры до вызова первого обработчика the_content и после вызова последнего), но это в планах.
Особенность плагина — поддержка как WordPress, так и bbPress.
По умолчанию плагин активен только для администратора (WordPress) и Key Master (bbPress); изменить это можно, повесив обработчик на фильтр enable_hook_profiler (должен вернуть true, если профайлер нужно активировать и false в противном случае).
История изменений:
- Версия 0.1:
- Первая версия плагина: поддержка WordPress и bbPress;
- Версия 0.2:
- Исправлена ошибка, приводящая к выдачи предупреждения
PHP Warning: Missing argument 1 for SjProfiler::end_profile() in /wp-content/plugins/sj-hook-profiler/lib/class.Profiler.php on line 74; - Ускорение производительности благодаря оптимизации кода.
- Исправлена ошибка, приводящая к выдачи предупреждения
- Версия 0.2.1:
- Добавлена поддержка WordPress 2.7.x (возможно, и более ранних версий).
Домашняя страница плагина на wordpress.org.
Внимание: плагин написан на PHP 5, PHP 4 не поддерживается принципиально.
Автор: Vladimir;
Комментарии к статье «SJ Hook Profiler» (10) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «SJ Hook Profiler»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


Плагин ругается:
Fatal error: Call to undefined function esc_attr() in /var/www/bagrincev.ru/wp-content/plugins/sj-hook-profiler/sj-hook-profiler.php on line 89
И не работает =(
Он писался для WordPress 2.8
Попробуйте заменить
esc_attr()наwp_specialchars()Сработало, спасибо!
Забыл указать версию Wordpress: 2.7
Обновил плагин до 0.2.1 — добавил поддержку WP 2.7.x
Поставил. Выдало, что вызов sanitize_comment_cookies – длится более одной секунды, init – 0.147369 сек. Не могли бы вы сказать как это исправить?
Спасибо большое за плагин!
Он всегда длится более секунды или эпизодически?
Если всегда, то нужно смотреть, какие обработчики вызываются на этой стадии и дальше смотреть, что с ними можно сделать.
Нет, сейчас все нормализовалось! Спасибо!
Поставил WP File Cache – вообще стало 0.00024 сек.!!! Вордпресс 3.0.1.
Я как понял этот плагин смотрит сколько времени отрабатывают функции других плагинов? А нельзя ли с его помощью посмотреть тоже самое для стандартных функций wordpress?
Andrey, таким образом можно померять только вызовы
do_action()иapply_filter().Если нужно измерить производительность именно WordPress, посмотрите в сторону xDebug.
Спасибо за ответ. А по отдельности можно померить через вызов add_action() произвольную функцию wordpress’а. К примеру сколько времени тратится на обращение к БД, ну или другую, сильно влияющую на производительность?