你的示例相当简单,因此无论给出什么答案,都可能不适用于在具有如此多次迭代的循环中实际放置代码。如果你的工作可以并行完成,那么我们可以将工作分配给几个网络工作者。你可以阅读关于网络工作者的详细介绍,并学习如何使用它们,网址是:
http://www.html5rocks.com/en/tutorials/workers/basics/。确定如何划分工作是一个挑战,完全取决于工作内容。由于你的示例非常简单,所以很容易将工作分配给内联的网络工作者;下面是一个函数,用于创建调用函数的异步工作者:
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;
};
当工人完成时,我们希望将他的总和加到总数中,并在所有工人完成时告诉我们结果,因此这是我们的回调函数:
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上提供了完整的示例。
totalCalc = 100*(Array(80190000).length)
- KooiInc