【问题标题】:Caching payoff: mobile versus server development缓存收益:移动与服务器开发
【发布时间】:2012-04-20 00:37:19
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • +1 表示“你有经验数据吗?”这是正确的问题。
  • 你可以为你的缓存对象使用 SoftReference(s)。如果内存紧张,这些对象将被收集,否则它们将有助于提高性能。

标签: java android ios caching


【解决方案1】:

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

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

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

我更喜欢缓存而不是娱乐。像位图这样的大对象除外,它们会占用数百 KB。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 2011-01-05
    • 2014-06-18
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多