javascript - 自调用函数+闭包改善垃圾收集导致的挂起

标签 javascript memory-management garbage-collection closures self-invoking-function

我正在尝试确定此模式是否有助于最大限度地减少我的 Javascript 游戏中的垃圾收集。

我在主游戏循环中调用了一个函数,其定义如下:

my.object.prototype.method = function(some_object) {
    var a,b,c,d,e,f,j,k;

    // initialize variables    
    // do stuff to some_object based on variables...

    return some_object;
}

变量最终成为对代码中其他位置的对象(或数值)的引用。

我正在尝试降低垃圾收集事件的频率和严重性,因为它们会导致帧速率出现卡顿。

重构为将变量存储在闭包中的自调用函数是否会导致变量被重新使用,而不是为每个函数调用重新分配?它对GC有什么明显的影响吗?

my.object.prototype.method = (function() {
    var a,b,c,d,e,f,j,k;

    return function(some_object) {
        // initialize variables
        // do stuff to some_object based on variables...
        // set variables to undefined 

        return some_object;
    }
})();

注意,这些不是在方法中分配的对象;只是对其他对象或基元的引用。

我尝试了一下,似乎让事情变得更糟了。 GC 似乎执行得更加频繁,并且每次对性能的影响大致相同(并且收集的内存量与以前大致相同)。

这里是否缺少一些可能会降低性能的东西?这是否会按照预期的方式运行(分配变量一次并重新使用它们而无需垃圾收集它们?)还是还有其他情况发生?

最佳答案

我对此并不肯定,但如果您使用删除功能清除代码中的对象,可能会有所帮助。我发现这篇有趣的文章可能会对您有更多帮助:https://www.scirra.com/blog/76/how-to-write-low-garbage-real-time-javascript

我特别会看看这个:

You can actually re-cycle an existing object (providing it has no prototype chain) by
deleting all of its properties, restoring it to an empty object like {}. For this you
can use the cr.wipe(obj) function, defined as:

    // remove all own properties on obj,
    effectively reverting it to a new object
    cr.wipe = function (obj)
    {
    for (var p in obj)
    {
        if (obj.hasOwnProperty(p))
            delete obj[p];
        }
    };

或者将它们设置为空,例如,如果使用数组,请将其长度设置为 0,这样以后重新分配它时就不必进行垃圾回收

关于javascript - 自调用函数+闭包改善垃圾收集导致的挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18700116/

相关文章:

javascript - 简单的 MEAN 堆栈问题

javascript - 这个网页是如何动态加载数据的?

javascript - 当所有div元素设置为显示:none时运行函数

c++ - 测量(自定义)分配器的执行时间?

c - 为什么访问 malloced 结构数组的成员会出现段错误?

.net - 取消对 "encourage".NET垃圾回收的引用有什么好处?

java - 在 Activity 的 onDestroy() 中使用 Runtime.getRuntime().gc() 方法是一种好习惯吗?

javascript - Google OAuth2 不适用于移动设备

java - 这是缓解 OutOfMemoryError 的好习惯吗?

java - 300-400 MB/min alloc/dealloc rate 是否适合 java gc?