🔙 Back to Top

Tue Mar 19 00:26:09 JST 2013

time of reducing max/min

これは一度ちょっと試したかった。 つまり、最大値、最小値を集めるのに、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未満の数列を作る。

max, min 関数使うver

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

if 使うver

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% だからね