2

現在、既存の C# Web サイトのパフォーマンス チューニングに取り組んでいます。MyUtil.csというクラスがあります。このクラスは、すべての Web ページで広く使用されています。一部のページでは、10/12 前後のインスタンスが作成されます (MyUtil)。「Redgate」パフォーマンス プロファイラーを実行しました。RedGate によると、オブジェクトの作成はコストのかかる操作です。各インスタンスは特定のプロパティを設定し、特定の操作を実行することに注意してください。そのため、オブジェクトをそのまま再利用することはできません。すべてのメンバー変数をリセットする必要があります。

このコードを最適化したい。次のオプションについて考えました。ここでどちらがより良いアプローチであるかを評価するのを手伝ってください:

(1)「MyUtil.cs」クラスに「Reset」メソッドを作成します。これにより、すべてのメンバー変数がリセットされます(167個あります:(..)。これにより、ページクラスで1つのオブジェクトを再利用できます。

(2) 複数オブジェクトの作成を続行します (「MyUtil」に Dispose() メソッドがあります)。

(3) 「オブジェクト プーリング」を考えましたが、やはりメンバーをリセットする必要があります。オブジェクトをプロジェクト レベルで維持するよりも、ページ レベルでオブジェクトをプールして解放する方がよいと思います。

これに関する返信をいただければ幸いです。前もって感謝します..!

4

2 に答える 2

1

すべてのアプリには、さまざまなサイズの高速化の機会が複数あります。たとえば、皿に盛られた料理の種類などです。通常、オブジェクトの作成と初期化はこれらのいずれかであり、通常は大きなものになる可能性があります。

オブジェクトの作成/初期化にかなりの時間がかかっていることがわかったときはいつでも、使用済みオブジェクトをリサイクルしています。これは基本的なテクニックであり、大きな違いを生むことができます。しかし、私はそれが時間のかなりの部分を節約できることがわかっている場合にのみそれを行います. 一般的な原則に基づいてそれを行うだけではありません。

于 2012-09-20T12:10:13.527 に答える
0

オブジェクトをリセットするのではなく、常に新しいオブジェクトを作成することをお勧めします。それは以下の理由による

  • GC は、オブジェクトを分類して世代を割り当てるのに十分なほどスマートです。コード内のオブジェクトの使用法によって異なります。プロファイリングは、コードの実行パターンとコードのアーキテクチャに基づいて行われます

  • GC を使用し、使用可能なハードウェア構成と使用可能なシステム リソースに基づいてガベージ コレクションのしきい値も決定するため、GC を使用してプロセスを管理すると、ハードウェアから最適な結果を得ることができます。

  • それとは別に、コードははるかに簡単で管理しやすくなります。- (これは直接的なメリットではありませんが、少なくともある程度の重みを与える必要があります。)

  • ページ レベルでオブジェクト プールを作成することもお勧めできません。これは、オブジェクトを再利用するには、プールからオブジェクトをフェッチし、そのプロパティをリセットするという 2 つのことを行う必要があるためです。つまり、追加の負担となるプールを管理する必要もあります。

  • オブジェクトの複数のインスタンスが必要な場合、単一のインスタンスを作成し、プロパティをリセットして再利用することもお勧めできません。これは機能しません。

結論としては、ページ内にオブジェクトを作成し続け、ガベージ コレクターにその仕事を任せるべきです。

于 2012-09-20T13:56:08.427 に答える