Как мне создать веб-приложение Perl?
Я работаю над веб-приложением, которое использует Perl, и мне нужно посмотреть на ускорение частей приложения.
Я думал, что начну профилировать конкретные призывы к той части, которую я хочу исследовать. Я сделал несколько поисков по профилированию кода Perl, но, к сожалению, большинство из того, что я нахожу, говорит, что я должен запустить свой код perl с помощью -d:DProf myapp
из командной строки. Это не работает для меня, так как мой код находится в веб-приложении. Я нашел способ получить профилирование для работы с apache, но, к сожалению, "наиболее используемые" модули, которые возвращались из профилировщика, были все модули CPAN - Class:: xyz и т.д. И т.д. Не очень полезно.
Кто-нибудь знает хороший способ, кроме меня, вводящий "таймер" код в методы, которые я хочу профилировать, чтобы нацелить только эти методы? Я подумал о написании теста script и профилировании, но из-за характера кода, над которым я работаю, потребуется немного больше работы, чем я надеюсь.
Ответы
Ответ 1
Вы пробовали Devel:: NYTProf (намного лучше, чем Devel:: DProf), который может работать под Apache? Какой веб-сервер вы используете? Это ванильный CGI script, вещь mod_perl или что-то еще?
Если вы делаете материал базы данных, DBI::Profile может тестировать ваши запросы, что происходит в другой программе.
Реальный трюк, однако, состоит в том, чтобы организовать код, чтобы вы могли выполнять весь спектр тестирования и профилирования без необходимости собрать все вместе в конце, чтобы узнать, что что-то происходит медленно. Это не поможет вам в краткосрочной перспективе бороться с пожарами, но в конечном итоге это предотвратит появление пожаров. Существуют также различные способы подделки среды веб-сервера и т.д., Но это другой вопрос.:)
Ответ 2
Если вы используете CGI.pm, вы можете передать аргументы в свой perl script в командной строке, а CGI.pm будет интерпретировать их так, как если бы они были переданы как параметры через HTTP. Итак, если вы отлаживаете, например
http://example.com/scripts/example.pl?action=browse&search=grommet&restrict=blah
тогда вы можете просто позвонить из командной строки, например.
perl -d:NYTProf documentroot/scripts/example.pl 'action=browse&search=grommet&restrict=blah'
Ответ 3
Вы можете использовать основной модуль Benchmark с опцией : hireswallclock, если вы действительно хотите, чтобы время было внутренним. Но на самом деле, вы должны иметь возможность профилировать из командной строки. Возможно, вам придется написать тестовые сценарии для эмуляции определенных частей запроса CGI, но DProf может быть чрезвычайно полезен при поиске узких мест производительности.
В частности, ищите, где ваш код вызывает код модуля CPAN. Вы можете делать это в циклах гораздо больше, чем необходимо, поэтому, пока время в модуле CPAN, рефакторинг кода может устранить проблему.
Ответ 4
Я понимаю, что это немного поздно для этого на данный момент, но это одна из причин, почему полезно использовать CGI:: Application или другая архитектура, в которой веб-приложение - это всего лишь очень короткий код веб-интерфейса, который использует кучу модулей, которые вы написали, для реализации фактической функциональности. Используя такую конструкцию, очень просто профилировать (или просто протестировать) любые модули из командной строки, индивидуально или коллективно, не беспокоясь о веб-аспекте.