3

信じられないほど低いプロセッサ速度で実行する必要があるアプリケーションを作成しています。このアプリケーションは、実行中に創造的な方法でメモリを作成および破棄し、問題なく動作します。どのようなコンパイラの最適化が行われるので、ビルドを試みることができますか?

そのため、リスト内の大量の要素を処理する必要がある場合は、ElementAt() を何度も呼び出すよりも、ToArray() を呼び出して処理する方がよい場合があります。 .

4

7 に答える 7

8

システムをビルドして実行し、プロファイラーをアタッチして何が遅いかを確認します。次に、Stack Overflow、Google、および常識を使用して、これらの領域を高速化します。

最も重要なことは、実際には重要でないことを高速化するために時間を無駄にしないことです。そのため、プロファイリングは非常に重要です。

于 2010-03-09T11:33:40.710 に答える
6

低速ではなく、高速を意味している可能性があります。

間違った言語。全体的な最適化のためには、より低いレベルの何かが必要です。必要ない場合がほとんどですが。

ところで、配列とリストの表示が間違っていることに注意してください... リストは、選択したものに応じてリンクされたリストであるため、配列とは異なるパフォーマンス特性を持っています。しかし、それはCLR /ランタイムの問題ではありません。

StringBuilder に加えて、私の主なアドバイスは、プロファイラーを使用することです。ほとんどの人はスピードを賢くしようとしますが、プロファイルを作成することはありません。そのため、後で役に立たない最適化に多くの時間を費やします。最初に、アプリケーションが実際に時間を費やしている場所を見つけます。

于 2010-03-09T11:25:40.837 に答える
2

通常、このレベルまで下げる必要があることはほとんどありませんが、私は現在、かなり似たようなことを行っています。いくつかの考え:

  • 定期的に使用しているバッファーはありますか? それらをプールすることを検討しましたか?つまり、新しいものを作成する代わりに、プールに取得 (または作成) するように依頼しますか?
  • 反射を取り除きましたか?(型指定されたデリゲートなどに置き換えますDynamicMethod) - またはそれをハードコアにしReflection.Emitますか?
  • 検討しましたunsafeか?(慎重に使用する必要がある場所では控えめに使用)
  • (繰り返しますが、かなり低レベルです) IL でばかげたことを探しましたか? 最近、適切なパラメーターを渡すためにスタック上で物事をシャッフルするために多くのサイクル (特定のコードで) が費やされていることがわかりました。コードを変更する (そして、確かにいくつかのカスタム IL を実行する) ことで、不要な (シャッフル) stloc/ldlocをすべて排除し、ほとんどすべてのローカルを削除します (プロセスのスタック サイズを縮小します)。

しかし、正直なところ、ここでプロファイルする必要があります。実際に重要なこと、または修正すべき問題があることがわかっている場所に焦点を当てます。

于 2010-03-09T12:13:02.030 に答える
2

アプリケーションで多くの文字列操作がある場合は、文字列の代わりにStringBuilderを使用してください。アプリケーションのパフォーマンスが大幅に向上します。

また、文字列連結 (+ 演算子) を StringBuilder に置き換えます。

Windows Forms .NET に固有で、 と をオフDataGridView.AutoSizeColumnsModeにしAutoSizeRowModeます。

于 2010-03-09T11:23:25.323 に答える
1

リストよりも配列が高速であることに言及しています。CLR は、配列にアクセスするときに、基本的な境界チェックを実際に行います。そのため、 unsafeキーワードを使用してから、ポインター演算を使用して配列にアクセスすることで、パフォーマンスをもう少し向上させることができます。これは、実際に必要な場合にのみ行ってください。特定のシナリオでのパフォーマンスの向上を測定できます。

于 2010-03-09T11:51:46.627 に答える
1

低レベルの最適化 (ほとんどの人がそうしています) について尋ねると、基本的にそれらが重要になると推測されます。あるレベルではそうなるかもしれませんが、ほとんどの人は高レベルの最適化によって節約できるものを過小評価しています。これは推測ではできません。

それは、目に見えるものはそこにあるもののほんの一部にすぎない、ことわざの氷山のようなものです。

これが例です。「プロファイラーを使用する」と言うのは躊躇します。
代わりに、これを行うと、私の経験では、はるかにうまく機能します。

于 2010-03-09T14:35:47.970 に答える
0

ガベージ コレクター (GC) にその作業を任せ、GC.Collect直接の呼び出しに干渉しないようにします。これにより、組み込みの GC アルゴリズムが効果的に実行されなくなり、実行が遅くなり、呼び出しGC.Collectによって不要なオーバーヘッドも追加される可能性があります。

GDI+ 固有の場合は、 which 呼び出しを呼び出してコントロールを再描画するInvalidate代わりに、コントロールまたはフォームのクライアント領域または特定の四角形を無効にするために呼び出します。Refreshinvalidateupdate

于 2010-03-09T11:28:38.530 に答える