我在<script>
网页上的标签内有以下代码,上面没有其他内容。恐怕我目前没有在线。如您所见,它以两种不同的方式将所有低于 200 万的素数相加,并计算平均花费的时间。该变量howOften
用于多次执行此操作,因此您可以对其进行平均。令我困惑的是,对于howOften == 1
,方法 2 更快,但对于howOften == 10
,方法 1 更快。即使您按 F5 几次,差异也很大并且仍然存在。
我的问题很简单:怎么会?
(这篇文章已被编辑以纳入 alf 的建议。但这没有任何区别!我现在非常困惑。)
(再次编辑:howOften
在或超过 1000 时,时间似乎很稳定。阿尔夫的回答似乎是正确的。)
function methodOne(maxN) {
var sum, primes_inv, i, j;
sum = 0;
primes_inv = [];
for ( var i = 2; i < maxN; ++i ) {
if ( primes_inv[i] == undefined ) {
sum += i;
for ( var j = i; j < maxN; j += i ) {
primes_inv[j] = true;
}
}
}
return sum;
}
function methodTwo(maxN) {
var i, j, p, sum, ps, n;
n = ((maxN - 2) / 2);
sum = n * (n + 2);
ps = [];
for(i = 1; i <= n; i++) {
for(j = i; j <= n; j++) {
p = i + j + 2 * i * j;
if(p <= n) {
if(ps[p] == undefined) {
sum -= p * 2 + 1;
ps[p] = true;
}
}
else {
break;
}
}
}
return sum + 2;
}
// ---------- parameters
var howOften = 10;
var maxN = 10000;
console.log('iterations: ', howOften);
console.log('maxN: ', maxN);
// ---------- dry runs for warm-up
for( i = 0; i < 1000; i++ ) {
sum = methodOne(maxN);
sum = methodTwo(maxN);
}
// ---------- method one
var start = (new Date).getTime();
for( i = 0; i < howOften; i++ )
sum = methodOne(maxN);
var stop = (new Date).getTime();
console.log('methodOne: ', (stop - start) / howOften);
// ---------- method two
for( i = 0; i < howOften; i++ )
sum = methodTwo(maxN);
var stop2 = (new Date).getTime();
console.log('methodTwo: ', (stop2 - stop) / howOften);