1

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

go(){
    setTimeout(function(){
        x++;
        go();
    },1);
}

我还有一个x每隔几秒就会记录到控制台的函数,但这不是问题。我所看到的是,无论我为超时设置什么值,我在示例中使用了 1,脚本每秒只能运行 1000 次。我正在做数亿级别的递归,所以这还不够快。当我将超时值设置为 0、0.1 或 1/10 时,我仍然每秒只能获得大约 1000 次。我尝试使用 32 位和 64 位浏览器(Chrome 和 Firefox)无济于事。

我怎样才能将速度提高一个档次?另外,我对这一切都比较陌生,所以如果解决方案是一个简单的解决方案,那就太棒了。

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

谢谢您的帮助!

4

4 回答 4

3

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

我不知道您如何在代码中使用递归,但显然您使用错误。

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

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

于 2013-03-10T00:20:21.357 回答
2

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

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

function onload() {
   for (var i = 0; i < 10; i++)
      setInterval(go, 1);
}
function go() {
   x++;
}
于 2014-01-10T20:45:23.833 回答
1

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

于 2013-03-10T00:25:07.970 回答
1

不可能让 setTimeout 等待少于 4 毫秒。这就是在 HTML 标准中定义setTimeout的方式(此处为官方规范)。您的问题更有可能与代码的结构有关。向我们展示您的其余代码,也许我们可以帮助解决它。

于 2013-03-10T00:31:49.650 回答