LoginSignup
1
0

JavaScript: 配列にまつわる速度検証

Posted at

宣言と配列長

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);
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0