我在Javascript中做了很多递归,为了防止堆栈溢出,我一直在使用setTimeout。这是一个快速的理论示例:
go(){
setTimeout(function(){
x++;
go();
},1);
}
我每隔几秒钟就有一个函数将x
记录到控制台,但这不是问题所在。我所看到的是,无论我为超时设置了什么值,我在示例中使用了1,脚本每秒只能运行1000次。我正在进行数亿次级别的递归,所以这还不够快。当我将超时值设置为0,或.1或1/10时,我仍然每秒只能获得大约1000次。我尝试过使用32位和64位浏览器(Chrome和Firefox)无济于事。
我怎样才能加快速度?此外,我对这一切都相对较新,所以如果解决方案很简单,那就太棒了。
哦,忘了提一下:如果我完全删除了setTimeout,我每次都会溢出堆栈。
感谢您的帮助!
答案 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++;
}