1) 在您开始项目之前,建立一种测量您正在使用的内存量的方法,最好以每个组件为基础。这样,每次进行更改时,您都可以看到它对内存使用的影响。您无法优化无法衡量的内容。
2) 如果项目已经成熟并达到内存限制,(或移植到内存较少的设备),请找出您已经使用内存的目的。
我的经验是,在修复超大应用程序时,几乎所有重要的优化都来自少量更改:减少缓存大小,去除一些纹理(当然这是需要利益相关者同意的功能更改,即会议,因此在您的时间方面可能效率不高),重新采样音频,减少自定义分配堆的前期大小,找到释放仅临时使用的资源并在需要时重新加载它们的方法。偶尔你会发现一些 64 字节的结构可以减少到 16 字节,或者其他什么,但这很少是最容易实现的结果。但是,如果您知道应用程序中最大的列表和数组是什么,那么您就知道首先要查看哪些结构。
哦,是的:查找并修复内存泄漏。任何可以在不牺牲性能的情况下恢复的记忆都是一个很好的开始。
过去我花了很多时间 担心代码大小。主要考虑因素(除了:确保您在构建时对其进行测量,以便您可以看到它的变化)是:
1) 找出引用了哪些代码,以及引用了什么。如果您发现整个 XML 库被链接到您的应用程序只是为了解析一个二元素配置文件,请考虑更改配置文件格式和/或编写您自己的简单解析器。如果可以的话,使用源代码或二进制分析来绘制一个大的依赖图,并寻找只有少数用户的大型组件:可能只需要少量的代码重写就可以将它们剪掉。准备好扮演外交官:如果您的应用程序中有两个不同的组件使用 XML,并且您想要削减它,那么您必须让这两个人相信手动滚动当前受信任的现成库的好处.
2) 乱用编译器选项。请查阅特定于平台的文档。例如,由于内联,您可能希望减少默认可接受的代码大小增加,而在 GCC 上,您至少可以告诉编译器仅应用通常不会增加代码大小的优化。
3) 尽可能利用目标平台上已有的库,即使这意味着编写适配器层。在上面的 XML 示例中,您可能会发现在您的目标平台上,内存中始终存在一个 XML 库,因为操作系统使用它,在这种情况下动态链接到它。
4) 正如其他人所提到的,拇指模式可以帮助 ARM。如果您只将它用于对性能不重要的代码,而将关键的例程留在 ARM 中,那么您将不会注意到差异。
最后,如果您对设备有足够的控制权,您可能会玩一些巧妙的技巧。 UI 一次只允许一个应用程序运行?卸载您的应用不需要的所有驱动程序和服务。屏幕是双缓冲的,但您的应用程序与刷新周期同步?您也许可以回收整个屏幕缓冲区。