使用间隔小于1的setTimeout

时间:2013-03-10 00:10:58

标签: javascript settimeout

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

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

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

我怎样才能加快速度?此外,我对这一切都相对较新,所以如果解决方案很简单,那就太棒了。

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

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

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

我不知道你在代码中如何使用递归,但很明显你错了。

对于递归的任何合理使用,你将远远没有溢出堆栈。如果您正在进行数亿次递归调用,那至少要花费一百万次。

使用递归时的常用方法是将每个级别的工作分成两半。通过这种方式,您可以处理所有可以放入内存中的项目,而不会超过大约30个级别。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

无法使setTimeout等待小于4毫秒。这就是HTML标准(官方规范setTimeout)中定义here的方式。您的问题很可能与代码的结构有关。向我们展示您的其余代码,也许我们可以帮助解决它。

答案 3 :(得分:1)

我尝试过像你一样的东西,找到了解决方案!您不需要递归和函数setTimeout,但您需要的只是在setInterval循环中重复使用1个区间所需函数的for函数。例如,如果for循环重复10次,那么10个定时器将每4 ms执行相同的功能。代码将越来越快地重复执行。

您的代码应如下所示:

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