2

我有以下内容正在更新屏幕上的一个元素,我似乎无法阻止它消耗内存,它每分钟消耗大约 0.10% 或 ram。

我已经尝试清空所有变量,但我似乎没有做任何事情来阻止这种泄漏。

function TimeTick(){
    var lt = new Date(); 
    lt.setMilliseconds(lt.getMilliseconds()-g_svros);
    var ch=lt.getHours(), cm=lt.getMinutes(), cs=lt.getSeconds(); 
    if(ch==0) ch=12; 
    $('#clock').val((ch >12?ch-12:ch)+":"+(cm<10?"0":"")+cm+":"+(cs<10?"0":"")+cs+" "+(ch>=12?"PM":"AM"));
    lt=null;ch=null;cm=null;cs=null;
}
var tick = setInterval('TimeTick()',250);

我通过对浏览器进程进行采样,从命令提示符中分析了浏览器的内存使用情况。

如果我禁用此功能,则内存不会增加并保持完全稳定!

4

3 回答 3

0

这是一个删除 eval 和函数声明的小提琴,并将 jquery 选择器移到函数之外:http: //jsfiddle.net/aBvdy/1/

$(function() {
    var g_svros = 0;
    var clock = $('#clock');
    var tick = setInterval(function() {
        var lt = new Date(); 
        lt.setMilliseconds(lt.getMilliseconds()-g_svros);
        var ch=lt.getHours(), cm=lt.getMinutes(), cs=lt.getSeconds(); 
        if(ch==0) ch=12; 
        clock.val((ch >12?ch-12:ch)+":"+(cm<10?"0":"")+cm+":"+(cs<10?"0":"")+cs+" "+(ch>=12?"PM":"AM"));
    }, 250);
});

我看了大约 5 分钟的 Chrome 进程管理器,该选项卡的内存使用情况只有非常轻微的波动。没什么好打电话回家的。

于 2013-09-06T05:14:02.067 回答
0

让我们做一些优化(当我说每次时,我指的是 TimeTick 函数的每次迭代):

  1. 每次都停止创建新的日期对象,因为它相当昂贵(如果您想阻止浏览器,这很有用!)没关系,您需要每次都这样做才能获取新的日期。
  2. 不要每次都重新选择#clock元素,jQuery每次都要访问DOM
  3. 使用匿名函数而不是 eval 因为 eval 需要更多的开销(解析等)
  4. 去掉变量的归零,这些实现了什么?由于 JS 具有函数作用域,ch, cs, 并cs在每个结束时被销毁,TimeTock然后被垃圾收集。

修改代码:

function TimeTick(lt, clock) {
     lt.setMilliseconds(lt.getMilliseconds()-g_svros);
     var ch= lt.getHours(), cm=lt.getMinutes(), cs=lt.getSeconds(); 
     if(ch==0) ch=12; 
     clock.val((ch >12?ch-12:ch)+":"+(cm<10?"0":"")+cm+":"+(cs<10?"0":"")+cs+" "+(ch>=12?"PM":"AM"));
}

var clock = $('#clock'); //Optimization 2
var tick = setInterval(function() {
    TimeTick(new Date(), clock); //Optimization 3
}, 250);
于 2013-09-06T05:20:40.503 回答
0

'TimeTick()'每 250 毫秒进行一次评估。

看看这是否有所作为:

var tick = setInterval(function () {
    TimeTick();
}, 250);

在此处查看评估基准。

于 2013-09-06T05:03:30.977 回答