Webページのタグ内に次のコードがあります<script>
。他には何もありません。私は現在それをオンラインで持っていないのではないかと思います。ご覧のとおり、2つの異なる方法で、200万未満のすべての素数を合計し、平均でかかった時間を計算します。変数howOften
はこれを何度も行うために使用されるため、平均化できます。私が困惑しているのはhowOften == 1
、方法2の方が速いのですがhowOften == 10
、方法1の方が速いということです。この違いは重要であり、F5を数回押しても保持されます。
私の質問は単純です:どうしてですか?
(この投稿は、alfの提案を組み込むように編集されています。しかし、それは違いはありませんでした。私は今、非常に困惑しています。)
(再編集:howOften
1000以上の場合、時間は安定しているように見えます。Alfの答えは正しいようです。)
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);