Javascript: For循环非常慢,任何方法都可以加速它
Javascript: For loop extremely slow, any way to speed it up?
我有一个从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的完整示例
相关文章:
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 在D3.js中,有没有任何方法可以将x和y方向上的滚动事件绑定到平移svg
- 有没有任何方法可以使用node-js从不同的机器打开浏览器
- PhantomJS - 检查javascript函数是否正在运行的任何方法
- 任何一种简单的方法都可以将带有onload的元素作为目标
- 有没有一种方法可以使用任何浏览器扩展整个dom树'的开发工具
- 在不重新加载的情况下更改标头URL的任何方法
- 使用jQuery.css()方法时,是否需要转义任何字符
- Javascript集:任何覆盖元素之间比较的方法
- 在离子2中,有任何方法可以将涡旋动量作为一个事件来检测
- 有没有任何方法可以将javascript对象从源代码传递到系统/浏览器剪贴板
- 任何编写文本文件并将其替换为上一个文本文件的方法
- 是否有任何内置方法可以更改JavaScript对象'的属性设置为某个值
- 在jquery中是否有任何方法或位置可以编写从Dom中删除页面后调用的方法
- 有没有任何情况下,一个方法不应该是原型方法
- 崇高的jslint:任何忽略特定代码段的方法
- 使用多功能框在 chrome 扩展程序中包含内联自动填充功能的任何方法
- 识别值是否与 jqGrid 数据中的任何键匹配的正确方法是什么?
- 在 1 个方法中增加变量值会触发另一个方法的 for 循环,欢迎任何建议