JScriptのメソッドの速度/unshift(1)

unshiftはArrayの先頭に要素を追加し、Arrayを返す。
複数追加できる。


長さ0のArrayを用意して、
何も追加しないというのを10万回繰り返す。
この実行時間の10回平均を出す。


// 232ms
function test1() {
var a = [ ];
for(var i = 0; i < n; i++) {
a.unshift();
}
}

// 1086ms
Array.prototype.unshift2 = function() {
var arg_length = arguments.length;
if(arg_length > 0) {
var length = this.length;
for(var i = length - 1; i >= 0; i--)
this[i+arg_length] = this[i];
for(var i = arg_length - 1; i >= 0; i--)
this[i] = arguments[i];
}
return this;
}

function test2() {
var a = [ ];
for(var i = 0; i < n; i++) {
a.unshift2();
}
}

unshift2は非常に時間がかかっているので、
いつものように、引数がないときはargumentsオブジェクトを使わないようにする。


// 360ms
Array.prototype.unshift2 = function(a) {
if(a != undefined) { // 引数あるとき
var arg_length = arguments.length;
var length = this.length;
for(var i = length - 1; i >= 0; i--)
this[i+arg_length] = this[i];
for(var i = arg_length - 1; i >= 0; i--)
this[i] = arguments[i];
}
return this;
}

でもやっぱり負けている。


今度は、1つずつ1000個の要素を先頭に加える。


// 238ms
function test1() {
var a = [ ];
for(var i = 0; i < n; i++) {
a.unshift(1);
}
}

// 480ms
function test2() {
var a = [ ];
for(var i = 0; i < n; i++) {
a.unshift2(1);
}
}

追加するのは1つずつのほうが多いに決まっているだろうから、
引数が1つのときは速くなるようにする。


// 459ms
Array.prototype.unshift2 = function(a, b) {
if(a != undefined) {
var length = this.length;
if(b == undefined) { // 引数1つのとき
for(var i = length - 1; i >= 0; i--)
this[i+1] = this[i];
this[0] = a;
}
else { // 2つ以上のとき
...
}
}
return this;
}

あまり速くならない。
ただ、こんなに大きい配列でshiftとかunshiftを使うのは
まっとうなプログラマのやることではないだろう。