C#で多くのイテレータを使用した場合のメモリ使用量への影響は?何千ものforeach
ループを実行するプログラムを仮定しましょう - 各ループはGetEnumerator
の呼び出しによってヒープ上に一時オブジェクトを割り当てますか? CLRはあらゆる種類の最適化を実行しますか(例えば、IEnumerator
オブジェクトのスタック割り当て)?それとも、これは単に心配するほど重要な問題ではありませんか?C#でのイテレータのメモリ使用量
答えて
ほとんどの場合、それほど心配するほど重要ではありません。エリックが指摘しているように、ケースが重要なケースがあるかもしれませんが、私の経験ではかなり少なくて済みます。
foreach
ループを何十万行している場合は、おそらく実際にはの作業をループ内で実行しているとします。それはほぼ確実にfarであり、イテレータ自身よりも重要です。
foreach
を配列(コンパイル時には配列であることがわかっています)に使用すると、とにかくIEnumerable<T>
は使用されません。直接インデックスを使用します。私はこれに基づいて私のコードを変更しません。
これまでのように、パフォーマンスを心配している場合は、パフォーマンスを測定してプロファイルする必要があります。ボトルネックは、あなたが期待する場所ではほとんどありません。
多くの場合、コンパイラはforeachループを単純なループに最適化することができます。このループは、スタック(またはプロセッサレジスタ)にインデックス変数のみを必要とします。
イテレータがまだ使用されている場合、それらのほとんどは構造体なので、ヒープ上ではなくスタック上に割り当てられます。
クラスである少数の反復子は、依然として非常に小さく高速です。あなたは目に見えないほどの影響を与えずに何百万というものを作り出すことができます。
すばらしい音...素早いフォローアップの質問:IEnumerableインターフェイスを実装すると、定義によってGetEnumeratorメソッドがIEnumeratorを返します。私のカスタムイテレータが構造体の場合、私はそれがボックスオブジェクトとして返されると仮定していますか? –
Jen、_carefully_リスト
しかし、ヒープ上に列挙子を作成することが、実際の、顧客に影響を与えるパフォーマンス上の問題の大きな原因であるという確かなデータがない限り、このようなことはやめてください。変更可能な値の型は、デバッグするのに費用がかかり、理解しづらいあらゆる種類の奇妙な問題を引き起こします。 –
- 1. C#のスレッドのメモリ使用量
- 2. C#/。NET:辞書のメモリ使用量
- 3. C malloc、ポピュレート時のメモリ使用量
- 4. メモリ使用量
- 5. メモリ使用量を減らす、C、CodeChef
- 6. C++でメモリ使用量を追跡し、メモリ消費量を評価する
- 7. 私のCプログラムのCPU使用量とメモリ使用量を表示したい
- 8. Silverlightメモリ使用量
- 9. メモリ使用量テスト
- 10. Silverlightメモリ使用量
- 11. RazorEngineメモリ使用量
- 12. CGPDFDocumentCreateWithURLメモリ使用量
- 13. IronPythonのメモリ使用量
- 14. モバイルウェブキットのメモリ使用量
- 15. メモリ使用量の分析
- 16. CCLabelBMFontのメモリ使用量
- 17. jQueryのイベントハンドラ - メモリ使用量
- 18. UIImageViewのメモリ使用量
- 19. IOSイメージのメモリ使用量
- 20. Androidサービスのメモリ使用量
- 21. Dockerコンテナのメモリ使用量
- 22. grailsアプリケーションのメモリ使用量
- 23. winformsアプリケーションのメモリ使用量
- 24. Powershellのメモリ使用量
- 25. リストビューのメモリ使用量
- 26. Javascriptのメモリ使用量ループ
- 27. Console.WriteLine()でのメモリ使用量の増加
- 28. 子プロセスのメモリ使用量ですか?
- 29. メモリ不足例外@ 50Mbメモリ使用量
- 30. jQuery $ .get()メモリ使用量
これは、いつものように優れたアドバイスJonですが、私たちのパフォーマンステストは、現実のシナリオではヒープ割り当て/イテレータのガーベジコレクションによって大きなパフォーマンスの影響を受けています。だからListの列挙子は参照型ではなく悪い可変値型です。しかしもちろん、そこには「私たちのパフォーマンステスト」というキーワードがあります。データなしでパフォーマンスを判断するのは愚かです。 –
ああ、邪悪な変更可能な 'List'イテレータ - 私は妥当なコードのように見えるニュースグループの投稿を覚えているようですが、そのデザインの決定のために非常に奇妙な結果が出ました:)答えを編集しますとにかく... "それは重要ではない"という包括的主張はめったに良い考えではない。 –