有什么方法可以提高JS中for循环的性能吗
Is there any way to increase performance for this for loop in JS?
我试图解决项目euler 10问题(找到200万以下所有素数的和),但代码需要很长时间才能完成,我如何让它更快?
console.log("Starting...")
var primes = [1000];
var x = 0;
var n = 0;
var i = 2;
var b = 0;
var sum = 0;
for (i; i < 2000000; i++) {
x = 0;
if (i === 2) {
primes[b] = i
sum += primes[b];
console.log(primes[b]);
b++;
}
for (n = i - 1; n > 1; n--) {
if (i % n === 0) {
x++;
}
if (n === 2 && x === 0) {
primes[b] = i;
sum += primes[b];
console.log(primes[b]);
b++;
}
}
}
console.log(sum)
您可以做的最大的超简单的事情使其更快:
-
当你找到一个除数时,就跳出内循环!
-
当你检查素性时,从小除数开始,而不是从大除数开始。你会发现复合材料的速度要快得多。
-
您只需要检查除数<=数学sqrt(n)
-
你只需要检查素数。你有他们的名单。
-
在循环外处理2,然后在循环内只做奇数:
for(i=3;i<2000000;i+=2)
这是另一个基于埃拉托斯特尼筛的版本。它需要更多的内存,但如果这与你无关,它也很快。
// just a helper to create integer arrays
function range(from, to) {
var numbers = [];
for (var i=from ; i<=to ; i++) {
numbers.push(i);
}
return numbers;
}
function primesUpTo(limit) {
if (limit < 2) return [];
var sqrt = Math.floor(Math.sqrt(limit));
var testPrimes = primesUpTo(sqrt);
var numbers = range(sqrt+1, limit);
testPrimes.forEach(function(p) {
numbers = numbers.filter(function(x) { return x % p > 0 });
});
return testPrimes.concat(numbers);
}
var primes = primesUpTo(2000000);
var sum = primes.reduce(function(acc, e) { return acc + e });
由于您无论如何都保留一个素数数组,因此可以将过程分为两个步骤:
- 生成上限为200万的素数
- 以及总结
正如其他人所指出的,你只需要检查一个候选数是否可以被另一个不大于该候选数平方根的素数除。如果你可以把一个数字写成素数的乘积,那么其中一个素数总是小于或等于这个数字的平方根。
这个代码可以进一步优化,但它比你的初始版本快几个数量级:
function primesUpTo(limit) {
if (limit < 2) return [];
var sqrt = Math.floor(Math.sqrt(limit));
var testPrimes = primesUpTo(sqrt);
var result = [].concat(testPrimes);
for (var i=sqrt+1 ; i<=limit ; i++) {
if (testPrimes.every(function(x) { return (i % x) > 0 })) {
result.push(i);
}
}
return result;
}
var primes = primesUpTo(2000000);
var sum = primes.reduce(function(acc, e) { return acc + e });
相关文章:
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 我的javascript for循环不起作用
- For循环冻结Javascript
- 如何在for循环中添加事件侦听器
- 双“for”循环(循环)
- javascript for循环不起作用
- for循环中的javascript if语句找不到==
- Javascript在for循环中等待处理请求
- For循环在Jquery中只运行一次
- 如何在for循环中使用计数器
- for循环中的JavaScript闭包
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- For循环在调用时未运行
- 如何使用for循环添加所有按钮'单击事件
- 如何更改在for循环中生成的圆的位置
- 为什么这个For循环会使浏览器实验室崩溃
- 为什么我使用javascript获得了一个无限的for循环
- 在for循环中使用多维数组设置google.maps.Marker图标
- 如何在angularJS中运行for循环而不使用html标记