我正在开发一个需要高度优化的Android项目(它是一个嵌入其他应用程序的SDK,所以显然我们希望它尽可能高效和小巧)。这对我来说相对较新,因为过去我主要完成了Web /服务器开发。
所以这就是问题:什么时候缓存值而不是计算/重新获取是有意义的。显然,计算/获取所需的时间越长,使用频率越高,缓存的候选者就越好。但是,服务器应用程序的缓存动态/成本/回报与移动应用程序完全不同。
在具有大量内存且服务于许多同时请求的服务器上,缓存重复使用的值是有意义的。在移动设备上,内存受到限制。即使重复使用某个值,缓存它还是重新计算/重新读取它会更有效吗? (我不是在讨论网络数据,这显然可以从本地缓存中获益。我正在谈论更多关于计算或从本地文件解析的值)
以下是我一直在想的一个例子:
if (s_pattern == null) {
s_pattern = Pattern.compile(REGEX);
}
一方面,我只编译一次RegEx并缓存它是有道理的,但另一方面,我不确定是否有很多东西可以证明使用额外的内存。
有没有人有任何经验或见解?或者你有经验数据吗?
答案 0 :(得分:1)
if(s_pattern == null){ s_pattern = Pattern.compile(REGEX); }
如果它永远不会改变,那么它是一个很好的候选者([private|public|] static final PATTERN
),并且在使用定义类时总是使用它。
如果您保留其中的几个或其他“小”对象,则不应该遇到问题。如果您每次甚至可以使用更多内存时重新创建它们,因为您可以在内存中拥有该对象的多个实例 - 垃圾收集不会立即删除。此外,恒定的对象娱乐将花费您的CPU时间,这在移动设备上也是有限的。
我希望尽可能缓存娱乐。例外是像位图这样耗费数百千字节的大对象。
您在Android上看到的几乎所有内存问题都与故意缓存无关,而与无意泄漏或滥用大图像无关。
顺便说一句:这不是基于经验数据 - 但如果你检查导致这些数据的原因,你可以得到一些:[android]+OutOfMemoryException