2012-11-04 147 views
3

我想測試一下我寫的Java程序,以證明它的效率。我有很多不同的測試可以運行,並且我試圖在運行時分析中做到精確。問題是不同的測試可能會訪問常見的磁盤上的信息。所以,爲了在我的實驗結果中「公平」,我想以某種方式通過程序清除我的Java程序使用的內部內存,在實驗之間。換句話說,我希望每個實驗都有相同的「空白內存/緩存」。java清除內部內存緩存

我試着在兩個實驗之間的大文件中讀取數據。我也嘗試重新啓動我的機器。有趣的是,當我讀入一個大文件時,當我重啓機器時(比如說40秒到5秒),時間會變得更糟。除了在每次實驗之間重新啓動我的機器之外,清除內部存儲器的正確方法是什麼(即,避免通過普通磁盤訪問進行人工加速實驗),這是不可行的?

+1

但是,爲什麼你認爲一個空的磁盤緩存是一個現實的場景?你只是在測試非常罕見的最壞情況。 –

+0

謝謝。我同意我正在測試最糟糕的情況,而且在實踐中,情況會更好。但是,我仍然想表明,即使在最糟糕的情況下,我的程序運行良好。 (我不想讓我寫的關於我的系統的論文的裁判有抱怨緩存問題。) – user1797753

+0

這裏沒有Java API,但可能有操作系統特定的方式來執行此操作。那麼您使用哪種操作系統? – nos

回答

0

什麼是清除內部存儲器

重新啓動計算機的正確方法。正如你所說,這可能不是最慢的選擇。

計算機的設計要儘可能高效,使得它們故意效率低下意味着對你想要實現的效率低下做出一些假設,所以沒有這樣做的標準方法。

清除已寫入文件的緩存的一種方法是刪除它們。如果要清除要保留的磁盤上的文件的緩存,可以編寫一大組文件,這些文件大於主內存並將其刪除。

如果您使用Windows,則無論如何都不會使用所有內存來緩存文件。你可以做的是一次寫出大小爲幾百MB的大文件,這個文件需要多長時間。當緩存耗盡時,你會發現它從Java中花費的時間突然增加,你知道在這一點上你可能已經清楚了緩存。發生這種情況後,請刪除它們,並且緩存很可能因此而爲空。

這可以幫助您獲得可重現的結果,但這可能與重新啓動不完全相同。注意:除非您希望每次運行應用程序時重新啓動計算機,否則重新啓動後花費的時間可能無意義。

順便說一句:磁盤緩存你應該擔心在操作系統。除了在您創建的緩衝區中以及在您編寫的代碼中,Java不會緩存文件,因此這些應該由您控制。