【发布时间】:2013-08-24 05:21:40
【问题描述】:
我有一个相当复杂的 Javascript 应用程序,它有一个每秒调用 60 次的主循环。似乎正在进行大量垃圾收集(基于 Chrome 开发工具中内存时间线的“锯齿”输出)——这通常会影响应用程序的性能。
因此,我正在尝试研究减少垃圾收集器必须完成的工作量的最佳实践。 (我在网上找到的大部分信息都是关于避免内存泄漏,这是一个略有不同的问题——我的内存正在被释放,只是垃圾收集太多了。)我假设这主要归结为尽可能重用对象,但细节当然是魔鬼。
该应用程序按照John Resig's Simple JavaScript Inheritance 的行按“类”构建。
我认为一个问题是某些函数每秒可以调用数千次(因为它们在主循环的每次迭代中使用了数百次),并且可能是这些函数中的局部工作变量(字符串、数组、等)可能是问题。
我知道更大/更重对象的对象池(我们在一定程度上使用它),但我正在寻找可以全面应用的技术,特别是与被调用很多次的函数相关的技术在紧密的循环中。
我可以使用哪些技术来减少垃圾收集器必须完成的工作量?
而且,也许还有 - 可以使用哪些技术来识别哪些对象被垃圾收集最多? (这是一个非常大的代码库,所以比较堆的快照并不是很有成果)
【问题讨论】:
-
您有可以向我们展示的代码示例吗?那时这个问题会更容易回答(但也可能不太笼统,所以我不确定)
-
每秒停止运行数千次函数怎么样?这真的是解决这个问题的唯一方法吗?这个问题似乎是一个 XY 问题。您正在描述 X,但您真正要寻找的是 Y 的解决方案。
-
@TravisJ:他每秒只运行 60 次,这是一个很常见的动画速率。他不是要求做更少的工作,而是如何做更有效率的垃圾收集。
-
@Bergi - “某些函数每秒可以调用数千次”。那是每毫秒一次(可能更糟!)。这根本不常见。每秒 60 次应该不是问题。这个问题过于模糊,只会产生意见或猜测。
-
@TravisJ - 这在游戏框架中并不少见。
标签: javascript garbage-collection