Javascript: For循环非常慢,任何方法都可以加速它

Javascript: For loop extremely slow, any way to speed it up?

本文关键字:方法 任何 都可以 加速 For 循环 非常 Javascript      更新时间:2023-09-26

我有一个从0到8019,000,000的for循环,非常慢。

var totalCalcs = 0;
for (var i = 0; i < 8019000000; i++)
    totalCalcs++;
window.alert(totalCalcs);

在chrome中,这需要30-60秒。

我也试过这样的变化:

var totalCalcs = 0;
for (var i = 8019000000; i--; )
    totalCalcs++;
window.alert(totalCalcs);

遗憾的是没有太大的区别。

我能做些什么来加快速度吗?

将您的问题视为关于多次迭代加速循环的更一般的问题:您可以尝试Duff的设备

在使用nodejs的测试中,下面的代码将第二个循环(i--)的循环时间从108秒减少到27秒

var testVal = 0, iterations = 8019000000;
var n = iterations % 8;
while (n--) {
 testVal++;
}
n = parseInt(iterations / 8);
while (n--) {
 testVal++;
 testVal++;
 testVal++;
 testVal++;
 testVal++;
 testVal++;
 testVal++;
 testVal++;
}

您的示例相当琐碎,任何答案都可能不适合您实际上放置在循环中进行多次迭代的代码。

如果您的工作可以并行完成,那么我们可以将工作分配给几个web工作者。
你可以在这里阅读一篇关于网络工作者的介绍,并学习如何使用它们:http://www.html5rocks.com/en/tutorials/workers/basics/

弄清楚如何划分工作是一个挑战,完全取决于工作是什么。因为你的例子很小,所以很容易在内联web工作者之间分配工作;下面是一个创建worker的函数,它将异步调用一个函数:

var makeWorker = function (fn, args, callback) {
    var fnString = 'self.addEventListener("message", function (e) {self.postMessage((' + fn.toString() + ').apply(this, e.data))});',
        blob = new Blob([fnString], { type: 'text/javascript' }),
        url = URL.createObjectURL(blob),
        worker = new Worker(url);
    worker.postMessage(args);
    worker.addEventListener('message', function (e) {
        URL.revokeObjectURL(url);
        callback(e.data);
    });
    return worker;
};

我们想要完成的工作是将数字相加,所以这里有一个函数来完成它:

var calculateSubTotal = function (count) {
    var sum = 0;
    for (var i = 0; i < count; ++i) {
        sum++;
    }
    return sum;
};

当一个worker完成时,我们想把他的总和加到总数中,并告诉我们所有worker完成时的结果,所以这里是我们的回调:

var total = 0, count = 0, numWorkers = 1,
    workerFinished = function (subTotal) {
    total += subTotal;
    count++;
    if (count == numWorkers) {
        console.log(total);
    }
};
最后我们可以创建一个worker:
makeWorker(calculateSubTotal, [10], workerFinished); // logs `10` to console

当这些部分放在一起时,可以快速计算出您的大数(当然,这取决于您的计算机有多少个cpu)。

我有一个关于jsfiddle的完整示例

相关文章: