これは一度ちょっと試したかった。 つまり、最大値、最小値を集めるのに、forで回して
var maxi = -1; // 数列には-1より大きいものしかないとする
for (var i=0; i<array.length; ++i) {
var a = array[i];
maxi = Math.max(maxi, a); // とするのと、
if (maxi < a) maxi = a; // あるいは、こうするのがある
}
上のほうは、aを一度参照しない。直接 array[i] と書いていい。 下では二度参照するので、一度何か変数に束縛するべきだ。 また、上では常に代入を行うが、下ではifによって代入を行わない 場合がある。
で、実際速度を計測する。
まず、入力としての数列を作る
(use srfi-1)
(use srfi-27)
(for-each (^i (print (random-integer 100))) (iota 10000))
一万個の、0以上100未満の数列を作る。
var maxi = 0,
mini = Infinity;
require("fs").readFileSync("/dev/stdin","utf8")
.split("\n").map(function(s){return +s})
.forEach(function(n) {
maxi = Math.max(maxi, n);
mini = Math.min(mini, n);
});
console.log(maxi, mini);
~/test$ time node test.js < input
99 0
real 0m0.114s
user 0m0.088s
sys 0m0.016s
var maxi = 0,
mini = Infinity;
require("fs").readFileSync("/dev/stdin","utf8")
.split("\n").map(function(s){return +s})
.forEach(function(n) {
if (maxi < n) maxi = n;
if (mini > n) mini = n;
});
console.log(maxi, mini);
~/test$ time node test.js < input
99 0
real 0m0.124s
user 0m0.072s
sys 0m0.028s
この差はあんまり無視できない 相対差 8% だからね