【发布时间】:2015-11-21 14:16:09
【问题描述】:
我正在尝试解决项目欧拉 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)
【问题讨论】:
-
您检测素数的方法效率低下。有一些优化:所有偶数都不是素数(使用
i % 2 == 0轻松检查)。你不需要从i - 1开始,你可以从Math.sqrt(i)开始,因为你只需要检查一半的潜在因素。 -
你可以通过使用 web workers 来提高性能并给每个 worker 一个数字范围,你也可以通过只检查直到数字的 sqrt 来判断他是否可以让这个代码更快一点是否是素数
-
这确实是 webworker 使用的完美有效示例。
-
网络工作者很酷,但我真的希望人们不要开始使用它们在我的所有核心上传播低效代码
标签: javascript performance loops for-loop