Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有可能有;“设置间隔”;设置得太快?_Javascript_Performance_Setinterval - Fatal编程技术网

Javascript 有没有可能有;“设置间隔”;设置得太快?

Javascript 有没有可能有;“设置间隔”;设置得太快?,javascript,performance,setinterval,Javascript,Performance,Setinterval,我的javascript中有一个setinterval函数,我希望尽可能快,即每1ms检查一次事件的状态。这是否可能对用户的浏览器要求过高?它似乎工作得很好,但我想知道这是否是一种不好的做法。setInterval不能保证精确地按照指定的间隔执行。 它将尽快执行,但由于javasript是单线程的,此时可能会执行其他一些代码,因此回调可能会延迟 如果使用setInterval的时间为1ms,则可能是试图以错误的方式解决问题。是的,如果传递给setInterval的函数引用的执行时间长于该时间间隔

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

setInterval
不能保证精确地按照指定的间隔执行。 它将尽快执行,但由于javasript是单线程的,此时可能会执行其他一些代码,因此回调可能会延迟


如果使用
setInterval
的时间为1ms,则可能是试图以错误的方式解决问题。

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

更快地执行一个函数,我肯定会质疑是否需要这种方法。您需要每1ms检查哪些内容,而不是每10ms、100ms或每秒检查一次

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


这个过程需要多少内存和CPU,您是否会潜在地降低用户浏览器的速度,让用户感到像滚动这样的简单操作变得痛苦?

这不仅是可能的,而且是很常见的。就其本质而言,这是一种竞赛状态。如果要在下一个间隔之前执行回调中的代码,请改用递归
setTimeout

另外,除非您的间隔被称为
lockUpBrowser
,否则回调之间的持续时间对于实际的性能处理来说可能太短了

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

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

while循环对你来说太慢了吗

while (condition)
  {
  //code block to be executed
  }
我知道我不是在回答你的问题,但是,我认为没有更好的方法来做这样的事情……

本·切里对此有一个想法,他测试了不同的浏览器,在它变得不可靠之前,找出设置间隔的速度有多快。
设置间隔
设置超时
的触发速度取决于浏览器

特别是,如果要在浏览器之间寻找一致的计时器间隔,则必须使用大于15毫秒的时间间隔


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

是的,这是可行的,但不是建议。好吧,看来大家一致认为我不应该使用1毫秒。会的,谢谢大家提供的信息。不会的。while循环只会完全执行一次。他可能需要setInterval从数据库中动态检索数据,即实时聊天、实时新闻提要等。鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久脱机。好的,@pableiros。我更新了我的答案,使之更加清晰。