4

このコードを実行すると:

//brute force
console.log('------------------');
console.log('Brute Force Method');
console.log('------------------');
var aTimer = process.hrtime();
var sum = 0;
for (var x = 3 ; x < 1000 ; x++) {
  if (x % 3 === 0 || x % 5 === 0) {
    sum += x;
  }
}
console.log('The sum of them is: '+ sum);
//console.log(aTimer);
var aTimerDiff = process.hrtime(aTimer);
console.log('Benchmark took %d nanoseconds.', aTimerDiff[0] * 1e9 + aTimerDiff[1]);

//arithmetic method
console.log('------------------');
console.log('Arithmetic Method');
console.log('------------------');
var bTimer = process.hrtime();
var term3 = parseInt(999/3);
var threes = 3 * term3 * (term3 + 1) / 2;
var term5 = parseInt(999/5);
var fives = 5 * term5 * (term5 + 1) / 2;
var term15 = parseInt(999/15);
var fifteens = 15 * term15 * (term15 + 1) / 2;
console.log('The sum of them is: '+ (threes + fives - fifteens));
//console.log(bTimer);
var bTimerDiff = process.hrtime(bTimer);
console.log('Benchmark took %d nanoseconds.', bTimerDiff[0] * 1e9 + bTimerDiff[1]);

console.log('------------------');
console.log('Which is Faster');
console.log('------------------');
if (bTimerNano > aTimerNano) {
  console.log('A is %d nanoseconds faster than B.', bTimerNano - aTimerNano)
}
else {
  console.log('B is %d nanoseconds faster than A.', aTimerNano - bTimerNano)
}

結果は次のとおりです。

------------------
Brute Force Method
------------------
The sum of them is: 233168
Benchmark took 64539 nanoseconds.
------------------
Arithmetic Method
------------------
The sum of them is: 233168
Benchmark took 155719 nanoseconds.
------------------
Which is Faster
------------------
A is 91180 nanoseconds faster than B.

それは正しくありません... 算術はもっと速くなるはずです。したがって、これらの行のコメントを外して確認します。

console.log(aTimer);
console.log(bTimer);

そして、結果は今では正確に見えます。

------------------
Brute Force Method
------------------
The sum of them is: 233168
[ 1697962, 721676140 ]
Benchmark took 1642444 nanoseconds.
------------------
Arithmetic Method
------------------
The sum of them is: 233168
[ 1697962, 723573374 ]
Benchmark took 284646 nanoseconds.
------------------
Which is Faster
------------------
B is 1357798 nanoseconds faster than A.

次に、それらの行をもう一度コメントアウトすると、同じファンキーな結果が得られます。

これが起こる原因は何ですか?process.hrtime() について何か不足していますか?

$ node -v
v0.10.0

編集: v0.8.11 でこれをテストしたところ、同じ種類の動作が得られました。

4

1 に答える 1

2

テスト ケースを完全に個別に実行すると、次の結果が返されます。

Brute Force:       [ 0, 32414 ]
Arithmetic Method: [ 0, 123523 ]

これらの結果は実行間でかなり一貫しているため、算術法の方が高速であるという最初の仮定は実際には間違っていると思います(編集:その理由はの使用のようですparseInt())。

中間で異なる結果が得られる理由は、おそらくそれ自体console.logが原因です。console.log

于 2013-03-18T17:45:54.720 に答える