美文网首页
[译]减轻GC压力的最佳实践

[译]减轻GC压力的最佳实践

作者: 袁韩 | 来源:发表于2016-06-17 09:00 被阅读203次

Best practices for reducing Garbage Collector activity in Javascript

原则 尽量减少创建(creating)与销毁(destroying)的过程

常见的创建过程

  • 使用new或者[],{}
  • 连接字符时str.concat()
  • 进入一个有函数定义的作用域
  • 进入错误catch阶段
  • 使用一个匿名函数时(function(){...})
  • 转换对象时Object(number),Number.prototype.toString.call(42)
  • 调用内置对象prototype方法时Array.prototype.slice
  • 使用arguments来获取函数参数时
  • 使用正则表达式来匹配或替换字符串时

优化建议

使用对象池或者重用组件

  • 将子作用域的函数提到更高级的作用域,匿名函数也可以算作这一类。在closure compiler会自动创建inline函数
function loopfunc()
{
    //do something
}

while(true)
{
    $.each(listofthings, loopfunc);

    options.ChangingVariable = newvalue;
    someOtherFunction(options);
}

将快于

while(true)
{
    $.each(listofthings, function(){
        //do something on the list
    });

    someOtherFunction({
        var1: value1,
        var2: value2,
        ChangingVariable: newvalue
    });
}
  • 尽量不要使用字符串于keydynamic addr

lookupTable[foo+x]document.getElementById('foo-' + x)两者都包含了字符串的创建.在很多情况下,你都可以将keys绑定到生命周期长的引用上,而非每次使用时,都重新创建它。根据浏览器,你可以考虑使用Map

  • 避免频繁的split调用和正则匹配

  • exception catch替换为if-else

try { op(x) } catch (e) { ... }

转换为

if (!opCouldFailOn(x)) { op(x); } else { ... }
  • 如果你不能避免创建字符串, 比如向服务器发送消息时,那么你可以使用内置的JSON.stringifyJSON.stringify使用内置的buffer来收集内容,而非为它们分配内存

  • 尽量不要频繁地调用匿名函数,这通常指某些高频率调用的回调函数。对于这种情况,尽可能的在外部作用域声明回调函数,而不是使用匿名函数形式

  • 避免使用arguments,因为每次使用arguments,都要创建一个类似于Array的对象

相关文章

网友评论

      本文标题:[译]减轻GC压力的最佳实践

      本文链接:https://www.haomeiwen.com/subject/tuqvdttx.html