宣言と配列長
chromeの場合は明らかに(3)が高速っぽい雰囲気を醸し出しています。Firefoxさんだと(2)が最速っぽいような。
{//1. 最初から配列長指定
let n=1e4,t=new Date;
for(;n;){let A=Array(n--)}
console.log(new Date-t)
}
{//2. length指定
let n=1e4,t=new Date;
for(;n;){let A=Array();A.length=n--}
console.log(new Date-t)
}
{//3. 末尾にundefined
let n=1e4,t=new Date;
for(;n;){let A=Array();A[--n]=void-1}
console.log(new Date-t)
}
ちなみに(2)と(3)はArray()
より[]
にした方が高速です。(3)は配列の振る舞いが他とは違うので注意。
埋め込み順
まずはお馴染みのArray(n)
による検証
{//末尾から先頭
let n=1e6,A=Array(n),t=new Date;
for(;n;)A[--n]=n;
console.log(new Date-t)
}
{//先頭から末尾
let n=1e6,A=Array(n),i=0,t=new Date;
for(;i<n;)A[i]=i++;
console.log(new Date-t)
}
そしてArray()
による検証。こちらは劇的な差が出る(Browserにもよる)。概ね後者の方が高速。A=[]
でもほぼ同様の結果。
{//末尾から先頭
let n=1e6,A=Array(),t=new Date;
for(;n;)A[--n]=n;
console.log(new Date-t)
}
{//先頭から末尾
let n=1e6,A=Array(),i=0,t=new Date;
for(;i<n;)A[i]=i++;
console.log(new Date-t)
}
巡回
ほぼ言わずと知られまくっている事ですが紹介。
let A=Array(1e6);
for(let a in A)A[a];//0周しかしませんよ
for(let a of A)a;//1周しますよ
A.map(a=>a);//0周
A.forEach(a=>a);//0周
そんな前置きはどうでもいいとして、巡回速度検証
let n=1e6,A=Array(n).fill(0),t;
t=new Date;
for(let a in A)A[a];
console.log(new Date-t)
t=new Date;
for(let a of A)a;
console.log(new Date-t)
t=new Date;
for(;n;)A[--n];
console.log(new Date-t)
for in
がぶっちぎりで桁違いに遅い。for of
は高速で使い勝手も良い。for
は最速になる傾向がります。
要素削除
以下の処理ではconsole.log
は何を出力するでしょう?
let a=[];
a[0]=a;
delete a[0];
a.push(a);
console.log(a.length);
1ではありませんよ。2が正解です。配列長もろとも変化させるにはpop()
、shift()
、splice()
等を使って削除する必要があります。
let a=[0,1,1,2,3,5,8,13,21,34,55,89,144];
a.splice(1,3);//途中削除
a.splice(0,2);//先頭から2つ分削除
a.splice(-2);//後方から2つ分削除
a.shift();//先頭削除
a.pop();//末尾削除
a.length--;//末尾削除
a.length=0;//全削除
a.length=null;//全削除
以下の処理ではaの値はどうなるかな?
let a='0 0m 0n 0y0the';
with(a.split(0))a=join(pop());
console.log(a)
そんな事は勿論どうでもいいので、pop()
とlength
書き替えの速度検証してみます。
let n=1e6,t=new Date;
for(let a=n,A=Array(n).fill(0);a--;)A.pop();
console.log(new Date-t);
t=new Date;
for(let a=n,A=Array(n).fill(0);a--;)A.length--;
console.log(new Date-t);
chromeもFirefoxも予想を裏切る結果になりました。なんとpop()
の方が遥かに高速。どうなってるんですか…。
要素追加
push()
とlength
はどうかと言うと、ほぼ同じ速度でした。
let n=1e6,t=new Date;
for(let a=n,A=[];a--;)A.push(a);
console.log(new Date-t);
t=new Date;
for(let a=n,A=[];a--;)A[A.length]=a;
console.log(new Date-t);