16

デリゲートを使用するとプログラムが遅くなりますか?

それらが私のプログラムを遅くするかどうか本当にわからないので、私はそれらを避けてきました。かなりの CPU パワーを使用する (キャッチ) 例外が発生するかどうかはわかっていますが、デリゲートとイベント、および .NET がそれらに対して行うことについてはわかりません。

4

4 に答える 4

18

デリゲートは非常に高速です。ダイレクト メソッド呼び出しほど速くはありませんが、それほど速くはありません。それらがボトルネックになる可能性はごくわずかです。

(同様に、適切に使用された場合、例外が実際にパフォーマンスの問題を引き起こすことはめったにありません。)

デリゲートを使用すると、コードがより単純になり、読みやすくなり、堅牢になりますか? もしそうなら、それらを使用してください。あなたのパフォーマンスを注意深く測定し、それに目を光らせてください。データが明確な場合にのみ、パフォーマンスのために読みやすさから離れてください。

デリゲート、インターフェイス、非仮想メソッド呼び出しなどの速度を示すグラフがいくつかあると確信しています-それらがどこにあるかはわかりませんが、本当に心配な場合はいつでも自分でテストを実行できます.

于 2008-11-20T09:32:36.140 に答える
9

Jon の投稿へのちょっとした追加: 通常の C# の方法 (つまり、ラムダ/匿名メソッド/イベント ハンドラーなどを介して) で使用すると、それらは間違いなく非常に高速です。 (実行時に構築されたメソッド、またはリフレクションと Delegate.CreateDelegate を介した既存のメソッド)。この 2 番目の方法で使用すると、デリゲートは(リフレクション Invoke などと比較して)非常に大幅な速度向上を提供します。

したがって、デリゲートの使用をためらわないでください。特に、疑わしい場合は、現実的なコードを測定してください。これが全体の実行時間の 0.01% しか占めていない場合、1 か 100 のマイクロイタチ* を使用しても意味がありません。

*=ほんの少しの恣意的な時間...

于 2008-11-20T09:41:59.210 に答える
6

私は Windows CE で作業しているので、この種のことはもう少し適切な場合があります。たとえば、リフレクションの大胆な適用は本当に害を及ぼす可能性があるため、適切な場合はリフレクションを避ける傾向があります (明らかに、リフレクションの小さな適用は問題ありません)。明らかに、私はデスクトップでそのような狂気はしません。

デリゲートと CE のパフォーマンスについて人々がつぶやいているのを聞いたことがありますが、私に関する限り、それは完全なガフです。「メソッド呼び出しが 30% 遅くなる」と聞きましたが、それがくだらないアルゴリズムの 30% だとしたら、それは誰のせいですか? CE のもう 1 つの速度低下は仮想メソッドです。ルックアップ テーブルがないため、最初は手動でそれらを解決し、結果をキャッシュします。これは、すべてのメモリを無駄にすると、それらのキャッシュが消去され、次回のパフォーマンス ヒットが発生することを意味します。しかし、そう考えると、パフォーマンスのために有用な OOP スキルを捨てるべきでしょうか?

これらの「OMGは遅すぎることを使用しない」という多くは、単なる言い訳にすぎません。人々は自分のアプリの何が本当に問題なのかを知らないため、主に言い訳をします。自分のコードではなく、CLR の内部動作のせいにするのは簡単です。パフォーマンスが最悪の場合、99.9% の確率で、ツールを捨てずにアプリやデザインの一部を変更して、はるかに優れた改善をもたらすことができると思います。

于 2008-11-20T11:59:27.933 に答える
6

プログラミングに関して言えば、パフォーマンスはデリケートな問題になる可能性があります。たとえば、ボクシングがすべての悪の根源であると断固として主張する人もいます。文字列連結はパフォーマンスに大きな影響を与えると考える人もいます。

実際には、すべては相対的なものであり、すべてはあなたが話している文脈に帰結します。モバイル デバイスでプログラミングしている場合は、デスクトップ アプリケーションで作業している場合よりも最適化する必要があります。

通常は、パフォーマンスとコードのエレガンスの間のトレードオフになります。世界で最も素晴らしくエレガントで、保守しやすく、理解しやすいコード ベースを作成したとしましょう。パフォーマンスの最適化を投入するとすぐに、直感に反する可能性のある、非常に特殊化されたものでコードをクラウド化し始めます。最適化に取り掛かると、パフォーマンスを 5 ~ 10% 節約できる可能性がありますが、その過程でコードの優雅さが完全に失われます。

問題は「それは価値があるか?」です。

プロジェクトにとってパフォーマンスが絶対的に重要な場合は、コードでプロファイラーを実行します。プロセッサ時間の 90% が特に非効率的な方法によって消費されていることがわかった場合、その方法は最適化の有力候補です。パフォーマンスが重要なアプリケーションで作業している場合を除き、通常、パフォーマンスの低い利点を追求する価値はありません。

于 2008-11-20T11:32:09.143 に答える