是否可以将“setInterval”设置得太快?

时间:2012-10-27 00:08:09

标签: javascript performance setinterval

我的javascript中有一个setinterval函数,我希望尽可能快,即每隔1ms检查一次事件的状态。是否有可能从用户的浏览器中询问太多?它似乎工作得很好,但我想知道它是否是一种不好的做法。

6 个答案:

答案 0 :(得分:8)

这不仅是可能的,而且非常普遍。从本质上讲,这是一种竞争条件。如果依赖于在下一个间隔之前执行的回调内部的代码,请改为使用递归setTimeout

此外,除非您的间隔调用lockUpBrowser,否则回调之间的持续时间可能太短,无法实现真实的性能处理。

(function myRecursiveTask() {
    // Do your task here
    myTask();

    if (!someConditionToAllowABailOut) {
        setTimeout(myRecursiveTask, 100); // 100ms loop
    }
}());

答案 1 :(得分:3)

setInterval无法保证在指定的时间间隔内执行。 它将尽快执行,但由于javasript是单线程的,并且此时可能会执行其他一些代码,因此您的回调可能会延迟。

如果你使用setInterval 1ms而不是你可能会以错误的方式解决问题。

答案 2 :(得分:1)

是的,如果传递给setInterval的函数引用需要的时间比间隔长,那么对该函数的调用将使浏览器排队并陷入困境。如果您正在尝试执行动画并希望尽快更改每个步骤,则应使用requestAnimationFrame函数用于现代浏览器。就个人而言,我从来不需要比每15ms更快地执行一项功能。

答案 3 :(得分:1)

我当然会质疑这种方法的必要性。您需要检查每1ms无法检查的每10ms,100ms或每秒?

您是否100%确定每次运行的检查功能将始终在< 1ms,这样您就没有多个检查进程堆叠起来运行。

这个过程需要多少内存和CPU,你是否可能会使用户的浏览器变慢,以至于像滚动这样的操作会让用户感到痛苦?

答案 4 :(得分:0)

对你来说太慢了吗?

while (condition)
  {
  //code block to be executed
  }

我知道我不是在回答你的问题但是,我认为没有比这更好的方法......

答案 5 :(得分:0)

Ben Cherry有一个good article关于此问题,他测试了不同的浏览器,以确定setInterval在变得不可靠之前有多快。 setIntervalsetTimout触发的速度取决于浏览器。

  

特别是,如果您在浏览器中寻找一致的计时器间隔,则必须使用> 15ms的内容。

因此,如果您可以将时间设置为大于15毫秒,则不会遇到问题。