Opera9.2系は配列を後ろから埋めていくと遅い?!
先日の「配列からn個の要素を重複無しでランダムに取り出す」の del.icio.us コメントより。
配列を後ろから埋めていく処理はOperaで実行するとやたら時間がかかったような気がします。
http://del.icio.us/url/6144e2f982e69a940e7ab74d8c319d78
BNJ
うっそだー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; }