2009-09-11 61 views
10

Moose是一個了不起的對象框架。麻煩的是,連同它的依賴關係,它的非常大。我們的分析表明,在我們的平臺上,只需加載Moose就會在非持久性CGI應用程序腳本上產生5-6秒的開銷。這對於這些一次性應用程序來說是不可接受的。相比之下,當我們使用一個持久的流程系統(如FCGI)時,這個啓動開銷被消除了(或者說,只發生一次),並且一切都很好。我們遇到的問題是,我們無法保證我們的所有代碼將始終運行在持續的過程中。如何提高非持久性CGI流程中的Moose性能?

我們使用Mouse作爲Moose的功能受限下拉替換進行了調查,但事實證明(如this answer中所述),這不是一個可行的選擇。我們編寫的任何與Moose一起工作的庫都不能以微妙而重要的方式與Mouse一起工作。而我們真的不想分叉我們所有的模塊,這樣我們就可以在持久環境中支持Moose和爲「香草」CGI鼠標。

鑑於此,我們有以下幾種選擇:

  1. 叉我們的內部模塊與任何穆斯或鼠標的工作,適當的。 (Yuck!)
  2. 只開發適用於FCGI/Moose的模塊。不再支持「香草」CGI了。如果我們必須編寫不持久的腳本,他們將無法利用我們的內部模塊。
  3. 不要使用駝鹿或鼠標,但一些其他的對象框架。

哪個選項最好?我們現在傾向於2,如果我們必須讓某些東西像香草CGI那樣運行,我們就會吮吸它。其他框架呢?有什麼更輕量的,我們應該看?

回答

10

我的選擇是放棄對香草CGI的支持。 FCGI託管這些天真的很便宜,沒有理由迎合香草CGI(國際海事組織),因爲它只是加強了Perl的速度慢的觀點。但如果你無法避免它,那麼你可以使用像Object::Tiny。但是如果你需要角色,約束,元編程和Moose提供的所有其他可愛,那麼除非你放棄了香草CGI,否則你運氣不佳。

1

還有另一種選擇 - PPerl

我從來沒有使用它,但它絕對看起來很有趣。寫這個的人(Matt Sergeant aka baud) - 它實際上保證了高質量的代碼。

+1

pperl由Matt Sergeant(波特)而非Matt Trout(mst)撰寫。 – perigrin 2009-09-11 15:23:22

+1

不是那個波特寫的質量比mst更少......只是他們不是同一個人。 – perigrin 2009-09-11 15:23:54

+0

啊。 thx清除它。我的錯。 – 2009-09-11 19:15:50

8

您可以使用Moose編寫後端服務器應用程序,然後編寫查詢後端的非常小且簡單的CGI腳本。

+-------+ +--------------+ 
| Small |===>| Persistent | 
| CGI |<===| Moose Server | 
+-------+^+--------------+ 
      | 
     Socket 
     Connection 

這或多或少是FCGI所做的,因此使用FCGI可能更有意義。

另一方面,根據需要可以有一個非cgi後端服務器可以有任何抽象接口的實際好處。例如,如果您使用TCP(或UDP)套接字,那麼您可以讓本機桌面應用程序與您的CGI相同的後端。

最適合你的情況取決於你的具體情況。根據情況的細節,我可以看到自己決定使用這種方法或上面概述的任何方法。

5

我的建議是使用選項#2,然後幫助我們重構駝鹿,使CGI變得可行。 fREW目前正在開發Moose測試套件,以便啓用MooseX :: Antlers項目,該項目應該可以減少大部分開銷,這意味着Moose無法在CGI環境中使用。

目前位於MooseX :: Antlers後面的人Matt Trout(mst)表達了希望能夠在CGI環境中運行應用程序(如果需要)的願望。我建議現在堅持使用FCGI,並且爲了幫助你做些什麼來糾纏他!

1

Jonathan Rockway在幾個月前寫了關於APP::Peristent(奇怪的是,它不在CPAN中)。我沒有用過它,但基於他上面鏈接的博客文章,它看起來提供了一個相當透明的服務器 - 客戶端體系結構,可以將您的CGI的實際處理包裝進去。

+1

是的,你可以使用它。但爲什麼不使用FastCGI或mod_perl? App :: Persistent用於命令行應用程序。 – jrockway 2009-09-12 14:09:54

1

App::Persistent的基本思想, pperl,SpeedyCGI並且可能還有一些其他情況是,將Perl程序編譯爲字節碼的過程只能進行一次,並且之後會在調用中使用某種緩存。由於穆斯說有相當的編譯時間損失,所以我會先嚐試這種方法。

我已經成功地使用了pperl在2001年左右的一個古​​老的系統上繪製了很多MRTG圖表。對於每個圖表都執行了Perl程序,這是相當開銷的 - 這可能與您的CGI方案相媲美。