我一直在基準框架,我在Perl編寫的表現和我得到的比我們現有的代碼庫每秒請求數減少了50%(有的命中是可以理解的,因爲我們是從程序麪條代碼會到一個OOP MVC框架)。如何在編譯時使用mod_perl執行低效的代碼?
該應用程序在mod_perl下運行,並且我已將Moose和我的所有框架代碼添加到startup.pl script中,該函數本身每秒會將我的請求數量加倍。我希望進一步提高這個數字,以儘可能接近現有金額。有人認爲這是過早的優化,但是我想解決一些明顯的低效問題,並且看看它是如何影響性能的。
最喜歡的框架,我有一個配置文件和調度。配置部分由Config::General處理,因此需要一點IO和解析來將我的配置文件加載到應用程序中。我在這裏看到的最大問題是,我正在爲每個請求都這樣做!
我的應用程序運行點傑韋利:: Dprof到配置::一般BEGIN和未駝鹿的主要慢點之一一堆相關的IO模塊。所以我想做什麼以及事後更加明智的做法是利用mod_perl的持久性和startup.pl編譯的特性,只做一次加載配置文件的工作 - 當服務器啓動時。
的問題是,我不是太熟悉,這將如何工作。
目前每個項目都有的PerlHandler引導類,這是很瘦,看起來像這樣:
use MyApp;
MyApp->new(config_file => '/path/to/site.config')->run();
MyApp.pm從框架項目模塊,其中有這樣的代碼繼承:
my $config = Config::General->new(
-ConfigFile => $self->config_file,
-InterPolateVars => 1,
);
$self->config({$config->getall});
爲了只在編譯時做到這一點,我的引導程序和項目基本模塊將不得不改變(我認爲),但我很不確定要做出什麼改變,並且仍然保持代碼的漂亮和精益。任何人都可以在這裏指出我正確的方向嗎?
UPDATE
我試着在他的答案通過YSTH描述了每個項目模塊的方法BEGIN塊。所以,我現在有:
package MyApp::bootstrap;
use MyApp;
my $config;
BEGIN
{
$config = {Config::General->new(...)->getall};
}
sub handler { ..etc.
MyApp->new(config => $config)->run();
這個快速變化的單獨給我以每秒請求50%增加,證實了我的想法,該配置文件是一個重大的瓶頸值得固定。我們的crotchety old dev機器上的基準數字是60rps,而我的框架已經從30rps變成了45rps,而這個變化本身就是如此。對於那些認爲Moose速度很慢並且編譯時間受到打擊的人來說。我在編譯我的配置文件時,在啓動時編譯了所有Moose代碼後,得到了同樣的(50%)增加。
我現在唯一的問題是,由於同樣的配置::常規 - >新的代碼是在每一個BEGIN塊只與路徑的配置文件不同這違反了DRY原則。我有幾個不同的策略來限制這一點,但我只是想公佈這個變化的結果。
該解決方案的問題在於,您必須爲每個項目模塊(每個項目都有自己的配置文件)使用該代碼創建此BEGIN塊。 我確實很快把這個放在了一邊,而且我的請求每秒增加了50%,所以我無論如何都滿口答覆,因爲它確實回答了我的問題 – 2008-12-05 10:53:10
要解決「每個項目都需要它自己的配置」,你可以 1)將所有文件合併成不同的部分(可以使用INI文件或Config :: ApacheFormat)。 2)有一個配置類,它將每個配置文件保存在一個散列中,並根據一些$ ENV變量提取正確的配置文件。 – mpeters 2008-12-05 14:11:10
我從來沒有真正考慮過擁有一個巨大的配置文件,因爲當您擁有數百個項目時,維護會有多困難......但實際上有很多好處,因爲我們在所有項目之間共享數據庫連接,除此之外在少數情況下。謝謝。 – 2008-12-05 15:04:39