2012-04-19 97 views
2

我正在研究一個需要高度優化的Android項目(這是一個嵌入其他應用程序的SDK,所以顯然我們希望它儘可能高效和小巧)。這對我來說是比較新的,因爲在過去,我主要完成了Web /服務器開發。緩存支出:移動服務器與服務器開發

所以,這裏是一個問題:什麼時候緩存數值而不是重新計算/讀取有意義。很顯然,計算/獲取所花費的時間越長,使用越頻繁,就越有可能用於緩存。但是,緩存的動態/成本/回報在服務器應用上與在移動應用中完全不同。

在服務器有很多內存的服務器正在提供多個同時請求時,緩存重複使用的值是有意義的。在移動設備上,內存受到限制。即使重複使用一個值,緩存它還是重新計算/重新讀取效率更高? (我不是在談論網絡數據,這顯然可以從本地緩存中受益,我更多地談論從本地文件計算或分析值)

這裏是我一直想知道的例子:

if (s_pattern == null) { 
    s_pattern = Pattern.compile(REGEX); 
} 

一方面,對我來說只有一次編譯RegEx並緩存RegEx是有意義的,但另一方面我不確定是否有很多值得證明使用額外的內存是正確的。

有沒有人有任何經驗或見解?或者你有經驗數據?

+0

+1「你有沒有經驗數據?」這是正確的問題。 – 2012-04-19 16:23:13

+1

您可以使用SoftReference(s)作爲您的緩存對象。如果內存緊張,這些對象將被收集,否則它們將有助於性能。 – Stefan 2012-04-19 17:27:02

回答

1

if(s_pattern == null){ s_pattern = Pattern.compile(REGEX); }

那是一個很好的選擇,以保持恆定([private|public|] static final PATTERN),如果它永遠不會改變,並用於定義類時,總是使用。

如果您保留其中幾個「小」對象,則不應出現問題。如果您每次甚至可以使用更多的內存時重新創建它們,因爲您可以在內存中擁有該對象的多個實例 - 垃圾收集不會立即刪除。恆定的對象重新創建會耗費CPU時間,這在移動設備上也受到限制。

只要可能,我寧願在緩存中重新使用緩存。例外情況是像位圖等大對象使用數百千字節。

您在Android上看到的幾乎所有內存問題都與有意緩存無關,但涉及意外泄漏或大圖像的濫用。

順便說一句:這不是基於經驗數據 - 但如果你檢查是什麼原因造成的,你可以得到一些:[android]+OutOfMemoryException