8

次の JavaScript コードを検討してください。

var s = "Some string";
s = "More string";

ガベージ コレクター (GC) は、この種の操作の後に行うべき作業を持っていますか?

(GC の一時停止を最小限に抑えようとするときに、文字列リテラルの割り当てについて心配する必要があるかどうか疑問に思っています。)

e: GC を最小化する必要があると質問で明示的に述べたにもかかわらず、誰もが私がそれについて間違っていると想定したことに、少し面白がっています。特定の詳細を本当に知る必要がある場合: JavaScript でゲームを持っています。Chrome では正常に動作しますが、Firefox では GC が原因のように頻繁に一時停止します。(Firefox の MemChaser 拡張機能で確認したところ、一時停止はガベージ コレクションと正確に一致しています。)

4

5 に答える 5

10

はい、動的に割り当てられた他のタイプのオブジェクトと同様に、文字列をガベージ コレクションする必要があります。はい、ビジー ループ内でのオブジェクトの不注意な割り当ては確実にパフォーマンスの問題を引き起こす可能性があるため、これは有効な懸念事項です。

ただし、文字列値は不変 (変更不可) であり、最新の JavaScript 実装のほとんどは「文字列インターニング」を使用します。つまり、一意の文字列値ごとに 1 つのインスタンスのみを格納します。つまり、このようなものがあれば...

 var s1 = "abc",
     s2 = "abc";

...「abc」のインスタンスが 1 つだけ割り当てられます。これは、オブジェクトではなく文字列値にのみ適用されStringます。

次の点に注意してください。

  1. substring、 などの関数はslice、関数呼び出しごとに新しいオブジェクトを割り当てます (異なるパラメーターで呼び出された場合)。

  2. 両方の変数がメモリ内の同じデータを指している場合でも、GC サイクルの実行時に処理する変数が 2 つあります。ローカル変数が多すぎると、それぞれを GC で処理する必要があり、オーバーヘッドが追加されるため、問題が生じる可能性があります。

高性能 JavaScript の作成に関するその他の資料:

于 2012-11-29T01:39:26.103 に答える
0

はい、ガベージ コレクターには、削除する文字列オブジェクトが含ま"Some string"れます。そして、あなたの質問への答えとして、その文字列の割り当ては GC で機能します。

文字列は不変であり、頻繁に使用されるため、JS エンジンには非常に効率的な方法で文字列を処理できます。いくつかの文字列のガベージ コレクションによる一時停止に気付かないはずです。ガベージ コレクターは、javascript プログラミングの通常の過程で常に行う作業があります。それが機能するはずです。

GC からの一時停止を観察している場合、それがいくつかの文字列によるものであるとは思えません。もっと大きな問題が進行している可能性が高いです。GC を必要とする何千ものオブジェクトがあるか、GC の非常に複雑なタスクがあります。コード全体を調べずに、それについて推測することはできませんでした。

巨大なループを実行して何万ものオブジェクトを処理していない限り、これは問題になりません。その場合、作成される中間オブジェクトの数を最小限に抑えるために、もう少し注意深くプログラムする必要があるかもしれません。ただし、そのレベルのオブジェクトがない場合は、最初に信頼性の高いコードを正しくクリアしてから、懸念すべきパフォーマンスの問題があることが何かによって示された場合にのみ、パフォーマンスを最適化する必要があります。

于 2012-11-29T00:54:55.570 に答える
0

はい。ただし、これを何百万回もループで実行しない限り、心配する必要はありません。

于 2012-11-29T00:55:55.657 に答える
-2

「GC の一時停止を最小限に抑えようとするときに、文字列リテラルの割り当てについて心配する必要があるかどうか疑問に思っています」という質問に答えるには: いいえ。

ガベージ コレクションに関しては、この種のことについて心配する必要はありません。

GC は、膨大な数の Javascript オブジェクトまたは多数の DOM 要素を作成および破棄する場合にのみ問題になります。

于 2012-11-29T00:56:14.933 に答える