【问题标题】:Javascript update time function causes high CPUJavascript更新时间函数导致高CPU
【发布时间】:2015-06-01 00:26:24
【问题描述】:

我有以下代码用于显示当前日期和时间,我希望它始终更新,因此我有一个 setInterval 每秒更新一次。这似乎导致该页面占用了 25% 的 CPU,并且它占用的内存不断攀升,页面打开的时间越长。

我能做些什么来提高它的性能吗?

jQuery(function($){
    (function update_time(){ 
        var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
        var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

        var dt = new Date();
        var hr = dt.getHours() > 12 ? dt.getHours() - 12 : dt.getHours();
        var mi = dt.getMinutes() < 10 ? "0" + dt.getMinutes() : dt.getMinutes();
        var sd = dt.getSeconds() < 10 ? "0" + dt.getSeconds() : dt.getSeconds();
        var div = dt.getSeconds() & 1 ? ":" : " ";

        $('.hour').text(hr);
        $('.minute').text(mi);
        $('.second').text(sd);
        $('.day').text(days[dt.getDay()]);
        $('.month').text(months[dt.getMonth()]);
        $('.date').text(dt.getDate());
        $('.year').text(dt.getFullYear());

        $('.time-divider').text(div);

        setInterval(update_time, 1000);
    })();
});

【问题讨论】:

  • 是的。每个setInterval 调用update_time,它调用setInterval,它调用update_time,它调用......因此不断攀升的内存使用量
  • 如果要每次调用定时器使用setTimeout,否则在函数外调用setInterval
  • 将 setInterval() 更改为 setTimeout()
  • setInterval 调用update_time 每次 时间1 秒过去,而setTImeout 只会在1 秒后调用update_time 一次

标签: javascript performance date time


【解决方案1】:

使用setTimeout 代替setInterval

上面的 cmets 已经很好地解释了原因,但我会重申。

您当前的函数将在每次调用时安排一个 setInterval,在任何现有函数之上。在 5 秒后,您将运行 32 间隔。这个数字每秒翻一番。

setTimeout 在一定时间后执行其回调函数一次。所以一秒钟后超时将触发并过期,函数将执行,并创建一个新的超时。冲洗并重复。

jQuery(function($){
    (function update_time(){ 
        var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
        var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

        var dt = new Date();
        var hr = dt.getHours() > 12 ? dt.getHours() - 12 : dt.getHours();
        var mi = dt.getMinutes() < 10 ? "0" + dt.getMinutes() : dt.getMinutes();
        var sd = dt.getSeconds() < 10 ? "0" + dt.getSeconds() : dt.getSeconds();
        var div = dt.getSeconds() & 1 ? ":" : " ";

        $('.hour').text(hr);
        $('.minute').text(mi);
        $('.second').text(sd);
        $('.day').text(days[dt.getDay()]);
        $('.month').text(months[dt.getMonth()]);
        $('.date').text(dt.getDate());
        $('.year').text(dt.getFullYear());

        $('.time-divider').text(div);

        setTimeout(update_time, 1000);
    })();
});

【讨论】:

  • 完美,正是我需要的。现在内存保持在 17mb 左右,CPU 为 0-1%。谢谢大家!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多