Javascript 使用间隔小于1的setTimeout

Javascript 使用间隔小于1的setTimeout,javascript,settimeout,Javascript,Settimeout,我在Javascript中做了很多递归,为了防止堆栈溢出,我一直在使用setTimeout。下面是一个快速的理论示例: go(){ setTimeout(function(){ x++; go(); },1); } 我还有一个函数每隔几秒钟将x记录到控制台,但这不是问题所在。我看到的是,无论我为超时输入了什么值(我在示例中使用了1),脚本每秒只能运行1000次。我正在做数亿级的递归,所以速度不够快。当我将超时值设置为0、0.1或1/10时,我仍然

我在Javascript中做了很多递归,为了防止堆栈溢出,我一直在使用setTimeout。下面是一个快速的理论示例:

go(){
    setTimeout(function(){
        x++;
        go();
    },1);
}
我还有一个函数每隔几秒钟将x记录到控制台,但这不是问题所在。我看到的是,无论我为超时输入了什么值(我在示例中使用了1),脚本每秒只能运行1000次。我正在做数亿级的递归,所以速度不够快。当我将超时值设置为0、0.1或1/10时,我仍然每秒只能得到大约1000次。我试过使用32位和64位浏览器Chrome和Firefox,但都没有用

我怎样才能把速度提高一个档次?另外,我在这方面还比较新,所以如果解决方案很简单,那就太棒了

哦,忘了提一下:如果我完全删除setTimeout,每次我都会使堆栈溢出


谢谢你的帮助

解决方案不在于运行当前代码,而在于重新思考代码

我不知道您是如何在代码中使用递归的,但很明显您使用它是错误的

对于递归的任何合理使用,都不会使堆栈溢出。如果您进行的递归调用达到数亿级,那么这至少要多出一百万倍


使用递归时的一种常见方法是将每个级别的工作分成两半。这样,您就可以处理内存中可以容纳的所有项目,而不必深入到大约30个级别。

您的解决方案不在于运行当前代码,而是重新思考代码

我不知道您是如何在代码中使用递归的,但很明显您使用它是错误的

对于递归的任何合理使用,都不会使堆栈溢出。如果您进行的递归调用达到数亿级,那么这至少要多出一百万倍


使用递归时的一种常见方法是将每个级别的工作分成两半。这样,您就可以处理内存中可以容纳的所有项目,而不必深入到大约30个级别。

JavaScript是单线程的,setTimeout将把您的操作放在队列的末尾。即使减少延迟,您仍然必须等待前面的操作完成,然后添加的操作才会生效。

JavaScript是单线程的,setTimeout将把您的操作放在队列的末尾。即使减少延迟,您仍然必须等待前面的操作完成,然后添加的操作才能生效。

设置超时等待时间不可能小于4毫秒。这就是HTML标准官方规范中的定义。更可能的问题是代码的结构。向我们展示您的其余代码,也许我们可以帮您整理。

设置超时等待时间不可能少于4毫秒。这就是HTML标准官方规范中的定义。更可能的问题是代码的结构。向我们展示您的代码的其余部分,也许我们可以帮您整理。

我尝试了与您类似的方法,并找到了解决方案!您不需要递归和函数setTimeout,但只需要在for循环中以1个间隔重复使用所需函数的setInterval函数。例如,如果For循环自身重复10次,那么10个计时器将每4毫秒执行一次相同的函数。代码将越来越快地重复执行

您的代码应该如下所示,例如:

function onload() {
   for (var i = 0; i < 10; i++)
      setInterval(go, 1);
}
function go() {
   x++;
}

我像你一样尝试了一些方法,找到了解决办法!您不需要递归和函数setTimeout,但只需要在for循环中以1个间隔重复使用所需函数的setInterval函数。例如,如果For循环自身重复10次,那么10个计时器将每4毫秒执行一次相同的函数。代码将越来越快地重复执行

您的代码应该如下所示,例如:

function onload() {
   for (var i = 0; i < 10; i++)
      setInterval(go, 1);
}
function go() {
   x++;
}

我想知道你为什么在客户端浏览器上做如此繁重的操作。如果你能找到一种方法在你的服务器上运行它会更好;如果使用setTimeout防止堆栈溢出,则不需要递归。那么为什么需要设置超时?递归速度变慢只会延迟溢出。您所做的似乎不正确setTimeout有一个最小超时,但如果您针对的是新浏览器,则可以使用window.postMessage尽可能快地完成相同的操作。我认为MDN有一个例子。现在无法在手机上发布真正的答案。也可以使用自定义事件来执行此操作,包括在旧浏览器上,但我没有尝试过。我想知道您为什么在客户端浏览器上执行如此繁重的操作。如果你能找到一种方法在你的服务器上运行它会更好;如果使用setTimeout防止堆栈溢出
g、 那你就不需要递归了。那么为什么需要设置超时?递归速度变慢只会延迟溢出。您所做的似乎不正确setTimeout有一个最小超时,但如果您针对的是新浏览器,则可以使用window.postMessage尽可能快地完成相同的操作。我认为MDN有一个例子。现在无法在手机上发布真实答案。也可以使用自定义事件来完成此操作,包括在旧浏览器上,但我没有尝试过。根据您的参考,最小值为4毫秒,而不是1毫秒。请查看注释,似乎您是对的。该函数将允许您指定1毫秒的延迟,但根据规范,在内部该延迟被提升为4毫秒。修复了。对,您甚至可以指定0毫秒的延迟-开发人员经常使用该延迟将执行移动到队列的末尾。您根本不必包含任何时间参数,它将在最小延迟后运行。根据您的参考,最小延迟为4毫秒,而不是1毫秒。请看注释,似乎您是正确的。该函数将允许您指定1毫秒的延迟,但根据规范,在内部该延迟被提升为4毫秒。修复了。对,您甚至可以指定0毫秒的延迟-开发人员经常使用该延迟将执行移动到队列的末尾。您根本不必包含任何时间参数,它将在最小延迟后运行。这只是以同样的方式做稍微多一些工作的一种方式,而且是一种糟糕的方式。只需在函数中多次执行相同的操作,就可以得到相同的结果,开销较小。这只是一种以相同方式执行稍微多一些工作的方法,而且是一种糟糕的方法。只需在函数中多次执行相同的操作,就可以获得相同的结果,并且开销较小。