2010-02-06 60 views
1

當BEGIN塊中的緩存被使用時,預熱緩存是個好主意嗎?在Perl的BEGIN塊中預熱高速緩存是否是一個好主意?

+9

最好在最高溫度200華氏度(約90攝氏度)下預熱緩存,然後在全溫下使用它。如果沒有預熱,高速緩存可能會形成小的微裂縫,從而可能引起腐爛。 : - > – 2010-02-06 06:31:45

+0

更多資訊幫助。 – 2010-02-07 18:02:10

回答

5

你並沒有真正提供你所談論的,我認爲這是重要的什麼樣的環境的任何信息。在大多數情況下,答案可能是「否」,但我可以想到一個確定的情況,那就是預先編譯服務器 - Web應用程序等。在這種情況下,您可以在「fork之前」執行的任何工作不僅可以節省讓孩子單獨重新計算相同值的成本,還可以節省內存,因爲包含結果的頁面可以在所有子進程之間共享由操作系統的COW機制。

如果你談論你正在寫一個模塊,而不是一個應用程序,那麼我會說,不,不要擡東西,編譯時未經用戶許可,除非他們的事情,都要做爲模塊工作。相反,請提供preheat_cache類方法,並且如果調用方有理由在編譯時需要熱緩存,則他們可以將調用本身置於BEGIN塊中。您也可以使用:preheat_cache導入標籤,但這在我的書中是不必要的。

1

通過熱身我假定你的意思是使用begin()來保證高速緩存任何東西在你的腳本執行前預裝?

如果你需要緩存讓你的程序正常運行,那麼是的,我認爲這將是一個好主意。

+0

不需要它正常運行,但它會是一個加速,我想知道如果這個 – Timmy 2010-02-06 06:27:44

+1

唯一的缺點,我看到的只是如果你有一個大緩存啓動速度較慢。 – joejoeson 2010-02-06 06:31:27

5

如果是在編譯時預先加載緩存,或預加載緩存,你在運行時做的第一件事之間進行選擇,有幾乎沒有差別。

如果你的緩存足夠大,加載它會引發大量的頁面交換的,那是等待,直到運行時的說法。這樣,所有的模塊加載和其他編譯時間代碼都可以在系統負載較輕的情況下完成。

2

即使我可能是錯的,我也會去「不」。推理是這樣的:保持代碼和它使用的數據很小,以便它在任何緩存中佔用以下的空間(我假設你的意思是CPU緩存,而不是具有常見查詢結果或某些此類事物的編程散列)。

除非你看到某種不好的訪問模式,試圖揣摩需要進行預取了可能是無用的最好的。事實上,這些代碼或初始化數據可能會取代您(或系統上的其他進程)實際使用的某些內容。考慮在代碼的實際工作部分中可以做些什麼來最大化引用的局部性,以便在任何時候儘量保持在較小的內存區域內。

我曾經使用「top」來檢測進程在內存和磁盤之間交換的時間。我還不知道有什麼好的工具可以告訴一個進程緩存未命中的時間,以及進入普通的老式慢速內存。必須有這樣的工具,我只是不知道它們是什麼(軟件工具,而不是一些定製的In Circuit Emulator類型的硬件)。也許這個在當天早些時候的一些想法...

+0

這是標記爲'perl';用戶從硬件抽象出來甚至意識到CPU緩存的存在。 – 2010-02-08 18:53:39

相關問題