2

我正在开发一个需要高度优化的 Android 项目(它是一个嵌入在其他应用程序中的 SDK,因此显然我们希望它尽可能高效和小型)。这对我来说相对较新,因为过去我主要进行 Web/服务器开发。

所以这里的问题是:什么时候缓存值而不是重新计算/获取有意义。显然,计算/获取所需的时间越长,使用的频率越高,缓存的候选对象就越好。但是缓存的动态/成本/回报在服务器应用程序中与在移动应用程序中完全不同。

在具有大量内存且同时服务于许多请求的服务器上,缓存重复使用的值是有意义的。在移动设备上,内存是有限的。即使重复使用一个值,缓存它还是重新计算/重新读取更有效?(我不是在谈论网络数据,这显然可以从本地缓存中受益。我更多地谈论从本地文件计算或解析的值)

这是我一直想知道的一个例子:

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

一方面,对我来说只编译一次 RegEx 并对其进行缓存是有意义的,但另一方面,我不确定是否有很多好处可以证明使用额外内存是合理的。

有没有人有任何经验或见解?或者你有经验数据吗?

4

1 回答 1

1

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

[private|public|] static final PATTERN如果它永远不会改变并且总是在使用定义类时使用,那是一个很好的候选保持不变( )。

如果您保留其中的几个或其他“小”对象,您应该不会遇到问题。如果您每次都重新创建它们,您甚至可以使用更多内存,因为您可以在内存中拥有该对象的多个实例 - 垃圾收集不会立即删除。此外,不断的对象重新创建会花费您的 CPU 时间,这在移动设备上也是有限的。

只要有可能,我更喜欢缓存而不是娱乐。像位图这样的大对象除外,它们会占用数百千字节。

您在 Android 上看到的几乎所有内存问题都与故意缓存无关,而是与大图像的无意泄漏或滥用有关。

顺便说一句:这不是基于经验数据 - 但如果你检查导致这些的原因,你可以得到一些:[android]+OutOfMemoryException

于 2012-04-19T16:20:30.323 回答