m2

Opera9.2系は配列を後ろから埋めていくと遅い?!

先日の「配列からn個の要素を重複無しでランダムに取り出す」の del.icio.us コメントより。

配列を後ろから埋めていく処理はOperaで実行するとやたら時間がかかったような気がします。
BNJ

http://del.icio.us/url/6144e2f982e69a940e7ab74d8c319d78

うっそだーwwwそんなことあるはずないよwww

改行付き:

(function(){
    function bench(f) { // http://d.hatena.ne.jp/nazoking/20050916/1126868725
        return function() {
            var start = new Date();
            f.apply(null, arguments);
            alert(new Date() - start + ' (ms)');
        }
    }
    var num = 30000;
    // 頭から。これはだいたい 100 (ms) 以下。
    bench(function(n) {
        var a = new Array(n);
        for (var i = 0; i < n; i++) {
            a[i] = i;
        }
    })(num);
    // 後ろから。これは 3000 〜 10000 (ms) かかる。
    bench(function(n) {
        var a = new Array(n);
        for (var i = n-1; i >= 0; i--) {
            a[i] = i;
        }
    })(num);
})()

マジだー!!! (Opera9.5ではどちらも"9.2以上に"速いです。)


あと concat を使わないほうだとループの中で比較処理が増えるために遅くなっちゃってました。というわけで concat を復活させて最終的にこの形に。

function random(array, num) {
    var a = array.concat();
    var l = a.length;
    var n = num < l ? num : l;
    var r = new Array(n);
    for (var i = 0; i < n; i++) {
        var c = Math.random() * l | 0;
        r[i] = a[c];
        a[c] = a[--l];
    }
    return r;
}