簡體   English   中英

PHP中“包含”的性能成本是多少?

[英]What's the performance cost of “include” in PHP?

只是想知道是否有人有關於“成本”的信息,包括一個包含100個類文件的大型(600K或更多)php文件。 與自動加載單個文件(例如在找到匹配項之前搜索多個目錄)相比,它真的有很大的不同嗎?

APC緩存會讓這個成本微不足道嗎?

基本上,包含一個大文件的成本取決於您的用例。 假設您有一個包含200個類的大文件。

如果您只使用1個類,那么包含大文件將比包含該類的小類文件更昂貴。

如果你使用所有200個類,包括大文件將比包含200個小文件便宜得多。

截止所在的位置實際上取決於系統。 我會想象它會在大約50%的標記處(如果你在任何一個請求中使用少於100個類,那么自動加載)。

並且使用APC可能會使盈虧平衡點更接近於更少的類別(因此沒有,使用的100個類可能是盈虧平衡點,但可能是使用了50個類),因為它使大單個包括更便宜,但只降低了每個人的開銷較小包括。

確切的收支平衡點將取決於系統100%(磁盤I / O速度,處理器速度,內存容量等)。 因此,在您的平台上確定的唯一方法是測試。

然而,與原始表現相比,更多的是利害關系。 可維護性將受到一個大文件的影響,因為同時處理多個類更難(IDE中的選項卡變得無用)。 我個人會將所有課程保存在單獨的文件中,讓我的生活更容易,而不是制作一個文件的巨大怪物。

現在,如果你有facebook流量水平,可能值得進一步調查。 但如果你不是,我個人不會擔心它......

我已經對php include()的各種成本進行了一些測試,我想分享,因為我看到許多程序員或CMS平台忽略了這些運行前的php成本。

功能本身的成本可以忽略不計。 100個文件包含(空文件)成本約5ms; 使用opcache時不超過1微秒。

因此,包含一個包含100個類的較大php文件而不是100個單獨文件包含的成本節省僅約5ms。 使用OpCode緩存會使成本無關緊要。

實際成本來自文件的大小,以及PHP必須解析和/或編譯的內容。 為了更好地了解這些成本是什么,這里是我在2010 Mac Mini Server上進行的測試結果,具有10,000 RPM驅動器,運行PHP 5.3並啟用了優化器eAccelerator opcache。

1µs  for 100 EMPTY File includes, w/opcache
5ms  for 100 EMPTY File includes, no opcache

7ms   for 100 32KB File includes, w/opcache
30ms  for 100 32KB File includes, no opcache

14ms  for 100 64KB File includes, w/opcache
60ms  for 100 64KB File includes, no opcache

22ms  for 100 128KB File includes, w/opcache
100ms for 100 128KB File includes, no opcache

38ms  for 100 200KB File includes, w/opcache
170ms for 100 200KB File includes, no opcache

因此,600KB的php文件大約花費6ms,或者使用操作碼緩存大約需要1ms。 你真正想要看的是每個請求包含的所有代碼的大小。

在組合中合並文件以嘗試和保存資源絕對不是一個好主意,並且在使用op-cache時會出錯。 如果有的話,我的測試不會非常考慮磁盤速度,因為我將相同的文件包含了100次。 這就是說我根本不需要覆蓋磁盤I / O,因為安裝op-cache實際上是基本性能方面的先決條件。

為了盡可能地獲得性能並節省RAM使用量,必須采取相反的措施。 這是通過使用自動加載器或類工廠模式盡可能地在上下文中拆分文件,以便為每個請求包含盡可能少的未使用代碼。

為此, 濫用include_once()也會產生負面的性能后果......

關於你的基類。 我有類似的情況,但我只包括表模式的一小部分。 主要是字段類型和主鍵詳細信息。 出於性能原因,我故意不會一直包含表格中相當繁重的模式,因為它們很少使用,當它們存在時,我每次請求只使用其中的幾個。

每個模式數組的表的平均完整列詳細信息大約為20-50k。 在任何給定的請求中包括10-15個它們的成本僅為1-3毫秒。 這本身並不多。 但是,當每個請求節省500k RAM時,它變得有價值。

APC將為您節省很多,但我不知道如果您的來源是600k,它是否可以忽略不計。 那是大約15000行代碼? 對於一個網站來說並不是那么多,但對於單個文件來說卻相當大。

您更願意在特定類中使用更動態的方法和隔離特定功能。 然后,對於每個頁面,您可以選擇所需的代碼。

特別是當您使用APC時,這種方法會更好,因為您沒有從磁盤加載許多小文件時將擁有的文件I / O開銷。 我會選擇實現小的指定類,並將每個類放在一個單獨的文件中。 您可以使用PHP類加載機制(__autoload)自動加載正確的單元。

當您為類和單元找出一個好的命名約定時,這將使您的開發更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM