いくつかの非特定の情報源から、との組み合わせを使用すると、を使用するよりも高速であるshift()
と聞いています。私はまだベンチマークテストを実行しておらず、町を離れてからしばらくは実行しない可能性が高いですが、これは本当ですか?もしそうなら、なぜですか?pop()
splice()
3 に答える
配列の順序を保持する必要がない場合は、を使用する.pop()
方がはるかに高速です.splice()
。
.splice()
指定されたインデックスの要素を削除します。その後、配列内の他のすべての要素は、配列内の位置を1つ減らす必要があります。配列が大きく、要素を削除するインデックスが小さい場合、これは遅くなる可能性があります。
を使用する.pop()
と、すべてのインデックスを完全に再作成するこのプロセスを削除できます。.pop()
特定のインデックスの要素を削除する代わりに、配列から最後の項目を削除するために使用できます。ここから、削除したいアイテムを、を使用して取得したアイテムに置き換えるだけです.pop()
。前述のように、これはもちろん、要素の順序が維持されないことを意味します。
コード例:
.splice()
:
var list:Array = [0,1,2,3,4,5];
list.splice(2, 1);
trace(list); // 0,1,3,4,5
そして.pop()
:
var last:* = list.pop();
list[2] = last;
trace(list); // 0,1,5,4 - Notice we move 5 to the index 2 and lose the order.
そして、ここに非常に重要な実際のパフォーマンステストがあります。
var list:Array = [];
function fillList():void
{
for(var i = 0; i < 200000; i++) list.push(i);
}
function emptyViaSplice():void
{
fillList();
var t:Number = getTimer();
while(list.length > 0)
{
list.splice(0, 1);
}
trace("emptyViaSplice: " + (getTimer() - t));
}
function emptyViaPop():void
{
fillList();
var t:Number = getTimer();
while(list.length > 0)
{
if(list.length == 1) list.pop();
else
{
var l:* = list.pop();
list[0] = l;
}
}
trace("emptyViaPop: " + (getTimer() - t));
}
結果:
emptyViaSplice(); // 12153 ms
emptyViaPop(); // 37 ms
別のコードを試したところ、結果は次のようになりました。
var length = 200000;
function fillList() {
var list = [];
for(var i = 0; i < length; i++)
list.push(i);
return list;
}
function halfViaSplice() {
var list = fillList();
var startTime = new Date();
list.splice(length/2, length/2);
var endTime = new Date();
console.log("halfViaSplice: " + (endTime - startTime));
}
function halfViaPop() {
var list = fillList();
var startTime = new Date();
while(list.length > length/2) {
list.pop();
}
var endTime = new Date();
console.log("halfViaPop: " + (endTime - startTime));
}
halfViaSplice();
halfViaPop();
結果:
halfViaSplice: 0
halfViaPop: 4
マーティの答えには同意しますが、1つのインデックスから最後のデータをすべて削除するだけでなく、穴の位置で削除する場合は、ポップよりもスプライスをお勧めします。
従来のアルゴリズムの方が高速な場合があります。アレイサイズを変更しないことは、非常に高速なパフォーマンスを実現するもう1つの方法です。performance.now()でいくつかのテストを行った後、以下のケースで、この古典的なアルゴリズムは、配列サイズを変更するどのメソッドよりも高速であり、すべてのjavascriptコードと同様に、ローカル変数を使用すると高速になります。
var ArrayLength = Array.length; // always prefer the simplest references.
for (i=1; i < ArrayLength; i++) {Array[(i-1)] = Array[i];}
Array [ArrayLength-1] = [[newdata1],[newdata2]];
同じ状況で比較すると、上記のコードは、よりわずかに速いことが証明されています
Array.shift(); Array.push([[newdata1],[ newdata2]]);
周期的に変更される小さな配列(20〜60のインデックス)の場合は、必ず従来のアルゴリズムを検討する必要があります。