2015-12-23 6 views
6

配列からそれを削除するには、配列の要素にdeleteを使用して問題配列エフェクトのパフォーマンス/メモリ消費量を削除し、続いて.push()を使用しますか?

は、私は.forEach()呼び出しは、インデックスをスキップするように配列から要素を削除することを意識してる唯一の方法です。

質問

  • exampleArray[i]は、例えば、その後のexampleArray.push()は配列オブジェクトのメモリ 消費量を増加させ インデックスにdeleteを使用していますか?
  • どうすればいいですか削除するオブジェクトはガベージコレクタに影響しますか?

  • 要素のexampleArrayをより効率的に削除する方法はありますか?旧

    var exampleArray = []; 
    var n = 500; 
    
    //Does this line imply a memory allocation? 
    exampleArray.length = n; 
    
    exampleArray.fill("Lorem Ipsum", 0); 
    
    exampleArray.forEach(function(cur, ind, arr) { 
        if(ind % 4 === 0) { 
        delete arr[ind]; //Actually deletes the object itself, index no longer exists 
        //Length does not change, however. Does available memory? 
        } 
    }, this); 
    
    n /= 4; 
    
    //Where, in memory, are these placed? 
    while(n--) exampleArray.push("amet dolor"); 
    

例すべてのヘルプは高く評価され、ありがとうございました。

+3

あなたの前提はかなり間違っています。 'delete'は配列からインデックスを削除する唯一の方法ではありませんが、実際にはそれは全く行われませんし、配列を意図したものでもありません。それがガベージコレクタやその他のものにどのような影響を与えますか?その後、実際には無関係になります。 – adeneo

+0

私はあなたのように聞こえるが、何の仮定もしていない。私はそれが私が気づいた唯一の方法だと言いました、私を啓発する気がしますか? –

+1

@ AndrueAndersonあなたの質問に対する短くて甘い答えを探しているなら、1)いいえ2)はありません3)[]。スプライス – Andbdrew

答えて

7

exampleArray[i]は、例えば、その後のexampleArray.push()は配列オブジェクトのメモリ消費量を増加させる、インデックスに削除使用していますか?

pushは、前に「delete」が付いていたかどうかにかかわらずメモリ消費を増加させます。通常。エンジンが追加項目のために記憶域をあらかじめ割り当てている場合は、おそらくそうではありません。エンジンが何らかの形でdeleteによって開かれたスペースを再利用できると想像しているならば、次のpushに追加メモリを割り当てるのを避けるために、おそらくそうではないでしょう。

要素を削除するとガベージコレクタにどのような影響がありますか?

削除された要素は、さもなければ範囲外になければGCの対象となります。

要素のexampleArrayをより効率的に除去する方法はありますか?

スパースアレイで終わるかどうかを決める必要があります。あなたがしない場合は、forEachなどの穴をスキップすると指摘すると、deleteが最速です。例えば、を使用して、削除された要素の周りで配列を圧縮する場合、コストは2倍高くなる可能性があります。

エンジンは、配列を内部的に表現するためのさまざまな戦略を実装しています。たとえば、配列が特定の希薄度に達した場合など、それらの間で切り替えを行うことがあります。各エンジンには異なる戦略があります。これらの種類のパフォーマンスに関する質問に答える唯一の信頼できる方法は、パフォーマンステストを実行するか、エンジンソースを読み取ることです。

GCについてのキーポイントは、あなたがそれを心配する必要がないということです。あなたはエンジンを二次的に推測したくない。あるエンジンで最適化し、別のエンジンでのパフォーマンスが悪化していることがわかります。

これらのマイクロ最適化の質問はすべて、何百万という演算子を実行している巨大なデータオブジェクトを含むロジックがある場合にのみ関係します。そのような場合は、独自のデータ構造をロールしたい場合があります。

+0

実際に質問を読んだり、疎な配列を特別に扱う.forEach()のコンテキストに気づいたことに感謝します。私は私の投稿を編集して、私が感謝する時を指定することができたらいいと思う。 –

0

deleteは非常に特殊な機能を持っています:removing a property from an objectです。配列から項目を削除するのに使用しないでください。代わりに

Array.prototype.spliceを使用します。

例えば:彼らはいくつかのオブジェクトへの参照のみを削除するために起こる場合を除き、ガベージコレクション、GCについての質問への答えで

var arr = [1,2,3,4]; 
arr.splice(1, 1); 

console.log(arr); // [ 1, 3, 4 ] 

deleteへの呼び出しによって影響を受けません。 deleteは強制的にGCを実行したり、それを容易にしません。

+0

downvoterさんにコメントしますか? – Andbdrew

+0

私はdownvoterではありませんが、配列要素**はオブジェクトのプロパティであることに注意してください。スパース配列で終わっても構わないのであれば、deleteを使うユースケースは確かです。 –

+0

@torazaburoこの文脈では、インデックスはプロパティであり、インデックスの実際の要素ではないと思います。 – Andbdrew

関連する問題