1

開始日と終了日を取り、特定のビジネス ロジックを通じて整数の結果を生成するヘルパー メソッドがあります。このヘルパー メソッドは、特定のデータ セットに対して 10,000 回を超えて呼び出されることがあります (ただし、頻繁に発生するわけではありません)。

質問: パフォーマンスのみを考慮して、このヘルパー メソッドを一部のヘルパー クラスの静的メソッドとして作成する方が効率的ですか?それとも、ヘルパー メソッドをクラスのパブリック メソッドとして使用する方が効果的ですか?

静的メソッドの例:

// an iterative loop
foreach (var result in results) {
    int daysInQueue = HelperClass.CalcDaysInQueue(dtBegin, dtEnd);
}

パブリック メンバー メソッドの例:

// an iterative loop
HelperClass hc = new HelperClass();
foreach (var result in results) {
    int daysInQueue = hc.CalcDaysInQueue(dtBegin, dtEnd);
}

助けてくれてありがとう!

4

5 に答える 5

2

インスタンス メソッドを呼び出すと、コンパイラは常に 1 つの追加パラメーターを目に見えないように渡します。このパラメーターは、そのメソッド内でthis名前の下に使用できます。staticメソッドはオブジェクトに代わって呼び出されないため、参照がありませんthis

ユーティリティメソッドをstatic次のようにマークする利点はほとんどありません。

  • わずかな パフォーマンスの向上であり、実際には使用しない参照に対して料金を支払う必要thisはありません。しかし、私はあなたが違いを見ることはないと思います.

  • 利便性static-いつでもどこでもメソッドを呼び出すことができます。コンパイラは、オブジェクトのインスタンスを提供することを強制しません。これは、そのメソッドには実際には必要ありません。

  • 可読性: インスタンス メソッドは、単にパラメーターではなく、インスタンスの状態で動作する必要があります。インスタンスが機能する必要のないインスタンス メソッドの場合は、混乱します。

于 2012-08-22T17:07:51.793 に答える
1

ここでのパフォーマンスの違いは事実上何もありません。時間の差を実際に測定する (そして、CPU で進行中の他の処理の「ノイズ」を乗り越える) のは非常に困難です。

たまたま大量のデータベースクエリを実行したり、オブジェクトのコンストラクター内のファイルから数ギガバイトの情報を読み取ったりしない限り (ここでは、単に空であると想定しています)、コストはかなり小さくなります。それはループの外にあり、まったくスケーリングしません。

標準的な慣行/読みやすさ/などに違反することによって、重要かつ必要なパフォーマンスの向上が得られると信じる強い理由が得られるまで、パフォーマンスに基づくのではなく、論理的に意味のあるものに基づいてこの決定を行う必要があります。

この特定のケースでは、操作は論理的に「静的」です。使用される状態がないため、メソッドを静的にする必要があるため、オブジェクトのインスタンスを持つ必要はありません。他の人は、パフォーマンスが向上する可能性があると述べていますが、これはおそらく真実ですが、それが静的にする理由ではありません。操作がインスタンス メソッドとして論理的に理にかなっている場合は、高速に実行するためだけに静的メソッドに強制しようとしないでください。それはここで間違った教訓を学んでいます。

于 2012-08-22T17:42:21.783 に答える
0

ベンチマークするだけです:)理論的には、静的メソッドは仮想呼び出しのオーバーヘッドを除外するため、より高速になるはずですが、このオーバーヘッドはあなたの場合には重要ではないかもしれません(ただし、例がどの言語にあるのかさえわかりません)。十分な回数の繰り返しで両方のループの時間を計測して、1 分ほどかかるかどうかを確認してください。重要なデータを使用していることを確認して、コンパイラが呼び出しを最適化しないようにしてください。

于 2012-08-22T17:08:01.683 に答える
0

私の理解では、静的メソッドにした方がパフォーマンスが向上します。これは、作成されたオブジェクトのインスタンスがないことを意味しますが、パフォーマンスの違いはごくわずかだと思います。これは、静的関数を呼び出すたびに再作成する必要のあるデータがなく、クラス オブジェクトに格納できる場合に当てはまります。

于 2012-08-22T17:08:36.833 に答える
0

あなたは「パフォーマンスのみを考慮する」と言います。その場合、中身に完全に集中する必要があります

HelperClass.CalcDaysInQueue(dtBegin, dtEnd);

そして、そのルーチンの呼び出しに費やされた実行時間の 0.0001% ではありません。短いルーチンの場合、JIT コンパイラはとにかくインライン化します。その場合、静的メソッドとインスタンス メソッドの間にパフォーマンスの違いはありません。

于 2012-08-23T09:41:08.197 に答える