我在網頁上有一個<script>
標記裏面的下面的代碼,其他都沒有。恐怕我目前沒有在線。正如你所看到的,它以兩種不同的方式將兩百萬以下的所有素數加起來,並計算平均花費多少時間。變量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);
方法1對我來說似乎總是比較快,當'howOften = 1'時:http://jsfiddle.net/KYsGm/。我用10000,因爲它花了太長的時間,否則。 – pimvdb 2012-01-14 13:09:35
這看起來像一個很大的問題:http://en.wikipedia.org/wiki/Time_complexity – Ted 2012-01-14 14:43:12