Я тестировал производительность фреймворка, который пишу на Perl, и получаю на 50% меньше запросов в секунду по сравнению с нашей существующей кодовой базой (некоторые попадания понятны, потому что мы идем от процедурных спагетти код для структуры ООП MVC).
Приложение работает под mod_perl, и я добавил Moose и весь мой код фреймворка в скрипт startup.pl , который сам удваивал количество моих запросов в секунду. Я рассчитываю еще больше увеличить это число, чтобы максимально приблизить его к существующей сумме. Есть аргумент, что это преждевременная оптимизация, но есть пара явных недостатков, которые я бы хотел исправить и посмотреть, как это влияет на производительность.
Как и большинство фреймворков, у меня есть файл конфигурации и диспетчер. Часть конфигурации обрабатывается Config :: General , поэтому для загрузки моего файла конфигурации в приложение требуется немного ввода-вывода и анализа. Самая большая проблема, которую я вижу здесь, состоит в том, что я делаю это для КАЖДОГО ЗАПРОСА, который приходит!
Запуск Devel :: Dprof в моем приложении указывает на Config :: General :: BEGIN и несколько связанных модулей ввода-вывода в качестве одной из основных медленных точек, которой не является Moose. Итак, что я хотел бы сделать, и что гораздо важнее в ретроспективе, так это воспользоваться постоянством mod_perl и возможностью компиляции startup.pl, чтобы выполнять работу по загрузке в файл конфигурации только один раз - при запуске сервера.
Проблема в том, что я не слишком знаком с тем, как это будет работать.
В настоящее время каждый проект имеет класс начальной загрузки PerlHandler, который довольно прост и выглядит следующим образом:
use MyApp;
MyApp->new(config_file => '/path/to/site.config')->run();
MyApp.pm наследуется от модуля Project, который имеет следующий код:
my $config = Config::General->new(
-ConfigFile => $self->config_file,
-InterPolateVars => 1,
);
$self->config({$config->getall});
Чтобы сделать это только во время компиляции, нужно будет изменить и мои модули начальной загрузки, и базовые модули Project (я думаю), но я не совсем уверен в том, какие изменения необходимо внести, и при этом сохранить код приятным и компактным. Кто-нибудь может указать мне правильное направление здесь?
UPDATE
Я попробовал НАЧАТЬ БЛОК в каждом подходе модуля проекта, как описано в его ответе. Итак, теперь у меня есть:
package MyApp::bootstrap;
use MyApp;
my $config;
BEGIN
{
$config = {Config::General->new(...)->getall};
}
sub handler { ..etc.
MyApp->new(config => $config)->run();
Одно только это быстрое изменение дало мне увеличение запросов в секунду на 50% , подтверждая мои мысли о том, что файл конфигурации был серьезным узким местом, которое стоит исправить. Контрольная цифра на нашей капризной старой машине разработки составляет 60 оборотов в секунду, и мой каркас изменился с 30 об / с до 45 оборотов в минуту только с этим изменением. Для тех, кто говорит, что Moose работает медленно и имеет время компиляции ... При компиляции всего моего кода Moose при запуске я получил такое же (50%) увеличение, как и при предварительной компиляции файла конфигурации.
Единственная проблема, с которой я столкнулся сейчас, заключается в том, что это нарушает принцип DRY, так как один и тот же код Config :: General-> находится в каждом блоке BEGIN, и путь к файлу конфигурации различен. У меня есть несколько разных стратегий, чтобы ограничить это, но я просто хотел опубликовать результаты этого изменения.