如何计算循环可以在Javascript中运行的最大次数?

时间:2011-11-24 12:07:45

标签: javascript memory-management loops for-loop cpu-usage

在Javascript中,如果我们有以下代码:

var j = 0;

for(i=0; i<j; i++){
  //JS Code
}

在这段代码中,变量j 的最大值(即浏览器不会挂起的值)的因素取决于(可能是机器的RAM或处理器,或者可能是代码在循环中执行)?

可以计算出这个最大允许值吗?

这是必需的,因为有一个需要处理的大型数组。

提前感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

不,你无法计算,从浏览器到浏览器的变化太大了。有些浏览器会按时间执行此操作(例如,您的代码运行时间超过X秒而不会返回浏览器;在Firefox 7上默认为10秒但the user can change it),其他浏览器按操作次数执行此操作( IE, for instance)。

您最好的选择是重构代码,以避免开始接近极限。如果您要完成大量工作,请将其分解为块,然后使用setTimeout一个接一个地运行块,其超时值为0。这会产生回到浏览器(超过0毫秒;确切地说,浏览器以及页面上发生的其他事情会有多长时间。)

以下是在100,000个迭代块中计算10,000,000的示例:

function toAMillion() {
  var counter = 0,
      limit = 10000000,
      chunk = 100000;

  doAChunk();

  function doAChunk() {
    var target = Math.min(limit, counter + chunk);

    while (counter < target) {
      ++counter;
    }

    if (counter < limit) {
      // Schedule next chunk
      setTimeout(doAChunk, 0);
    }
    else {
      // Done
      display("Done, counter = " + counter);
    }
  }
}

Live copy

答案 1 :(得分:1)

在处理大量数据时保持UI响应的常见做法称为分块。你雕刻了一组项目,并使用setInterval或setTimeout来包装每个组的循环。