信じられないほど低いプロセッサ速度で実行する必要があるアプリケーションを作成しています。このアプリケーションは、実行中に創造的な方法でメモリを作成および破棄し、問題なく動作します。どのようなコンパイラの最適化が行われるので、ビルドを試みることができますか?
そのため、リスト内の大量の要素を処理する必要がある場合は、ElementAt() を何度も呼び出すよりも、ToArray() を呼び出して処理する方がよい場合があります。 .
信じられないほど低いプロセッサ速度で実行する必要があるアプリケーションを作成しています。このアプリケーションは、実行中に創造的な方法でメモリを作成および破棄し、問題なく動作します。どのようなコンパイラの最適化が行われるので、ビルドを試みることができますか?
そのため、リスト内の大量の要素を処理する必要がある場合は、ElementAt() を何度も呼び出すよりも、ToArray() を呼び出して処理する方がよい場合があります。 .
システムをビルドして実行し、プロファイラーをアタッチして何が遅いかを確認します。次に、Stack Overflow、Google、および常識を使用して、これらの領域を高速化します。
最も重要なことは、実際には重要でないことを高速化するために時間を無駄にしないことです。そのため、プロファイリングは非常に重要です。
低速ではなく、高速を意味している可能性があります。
間違った言語。全体的な最適化のためには、より低いレベルの何かが必要です。必要ない場合がほとんどですが。
ところで、配列とリストの表示が間違っていることに注意してください... リストは、選択したものに応じてリンクされたリストであるため、配列とは異なるパフォーマンス特性を持っています。しかし、それはCLR /ランタイムの問題ではありません。
StringBuilder に加えて、私の主なアドバイスは、プロファイラーを使用することです。ほとんどの人はスピードを賢くしようとしますが、プロファイルを作成することはありません。そのため、後で役に立たない最適化に多くの時間を費やします。最初に、アプリケーションが実際に時間を費やしている場所を見つけます。
通常、このレベルまで下げる必要があることはほとんどありませんが、私は現在、かなり似たようなことを行っています。いくつかの考え:
DynamicMethod
) - またはそれをハードコアにしReflection.Emit
ますか?unsafe
か?(慎重に使用する必要がある場所では控えめに使用)stloc
/ldloc
をすべて排除し、ほとんどすべてのローカルを削除します (プロセスのスタック サイズを縮小します)。しかし、正直なところ、ここでプロファイルする必要があります。実際に重要なこと、または修正すべき問題があることがわかっている場所に焦点を当てます。
アプリケーションで多くの文字列操作がある場合は、文字列の代わりにStringBuilderを使用してください。アプリケーションのパフォーマンスが大幅に向上します。
また、文字列連結 (+ 演算子) を StringBuilder に置き換えます。
Windows Forms .NET に固有で、 と をオフDataGridView.AutoSizeColumnsMode
にしAutoSizeRowMode
ます。
リストよりも配列が高速であることに言及しています。CLR は、配列にアクセスするときに、基本的な境界チェックを実際に行います。そのため、 unsafeキーワードを使用してから、ポインター演算を使用して配列にアクセスすることで、パフォーマンスをもう少し向上させることができます。これは、実際に必要な場合にのみ行ってください。特定のシナリオでのパフォーマンスの向上を測定できます。
ガベージ コレクター (GC) にその作業を任せ、GC.Collect
直接の呼び出しに干渉しないようにします。これにより、組み込みの GC アルゴリズムが効果的に実行されなくなり、実行が遅くなり、呼び出しGC.Collect
によって不要なオーバーヘッドも追加される可能性があります。
GDI+ 固有の場合は、 which 呼び出しを呼び出してコントロールを再描画するInvalidate
代わりに、コントロールまたはフォームのクライアント領域または特定の四角形を無効にするために呼び出します。Refresh
invalidate
update