0

この記事を読んで、メソッドを呼び出す方法がいくつか見つかりました。

呼び出すメソッド:

public static void SendData(string value) { }

通話:

delegate void MyDelegate(string value);

//Slow method - NOT RECOMMENDED IN PRODUCTION!        
SendData("Update");

// Fast method - STRONGLY RECOMMENDED FOR PRODUCTION!
MyDelegate d = new MyDelegate(SendData);
d.BeginInvoke("Update", null, null);

本当ですか?速いですか?

Action send = () => Send("Update");
send();

それともこれ?

最大のパフォーマンスでメソッドを SQL CLR トリガーに呼び出す必要があるため、わずかな速度の増加でも意味があります。

4

5 に答える 5

20

「速い」のはどっち?

1) ボブに芝刈りを頼む。彼が終わるまで待ってください。その後、モールに行きます。

2) ボブに芝刈りを頼む。彼があなたの芝生を刈っている間、モールに行ってください。

2 番目のテクニックを使用すると、ショッピング モールにすばやく移動できます。あなたが支払う代償は、家に帰るまでに芝生が刈られているかどうかわからないということです. 最初のテクニックでは、ショッピング モールから家に帰ると芝生が刈られていることを知っています。最初に出かける前に待っていたからです。あなたの論理が、あなたが戻ってくるまでに芝生が刈られていることを知っていることに依存しているなら、2番目のテクニックは間違っています.

ここで重要な点は次のとおりです。明らかに、どちらのテクニックも芝生を他の方法よりも速く刈ることはできません。 「どっちが速い?」と聞かれたら 速度を測定している操作を示す必要があります。

于 2010-07-21T15:01:56.400 に答える
13

デリゲートを使用しても、メソッドを直接呼び出すよりも高速ではありません (実際には、デリゲートを作成してから呼び出すと、よりコストがかかります)。

これが高速に見える理由は、メソッドを直接呼び出すと、メソッドの実行中に実行中のスレッドがブロックされるためです。デリゲートの例では、( を使用してBeginInvoke) メソッドを非同期的に呼び出すため、メソッドの実行中も呼び出し元のスレッドが実行され続けます。

また、デリゲートで BeginInvoke を呼び出すときはいつでも、対応する EndInvoke も必要です。例では欠落しています。

EndInvoke() はオプションですか、一種のオプションですか、それとも絶対にオプションではありませんか?

IanG on Tap: EndInvoke はオプションではありません

于 2010-07-21T14:52:28.530 に答える
2

SendDataいつ発信者に戻るか という観点から見た、プラセボ速度の向上です。BeginInvokeスレッドを取り、ThreadPoolそのスレッドでメソッドを開始し、すぐに呼び出し元に戻ります。実際の作業は別のスレッドにあります。この作業にかかる時間は、スレッドがオンになっているかどうかに関係なく同じままです。作業によっては、アプリケーションの応答性が向上する可能性がありますが、デリゲートはダイレクト メソッド呼び出しよりも高速ではありません。

これを試してみてください: - に変更BeginInvokeして、通常Invokeの呼び出しと同じように、呼び出し元が現在ブロックされています。SendData

コードのコメントがあなたのものではないと仮定すると(つまり、「本番環境に推奨」)、責任のある開発者をすばやく見つけて、彼らが認識Delegate.BeginInvokeせずにアプリをマルチスレッド化しているという事実を認識していることを確認します...

質問に答えるには、ダイレクト メソッド呼び出しが常に最速の方法です。デリゲートまたはリフレクションによってオーバーヘッドが発生します。

于 2010-07-21T14:55:05.923 に答える
1

あなたが引用した記事では、著者はWCF呼び出し、特にデータベースの挿入と更新の呼び出しについて話していることに注意してください。

その特定のケースで注意すべき重要なポイントは次のとおりです。

  • 作業は別のマシンによって行われています。
  • あなたが得ている唯一の情報は「成功!」です。(通常)または(時折)「失敗」(作者は気にしていないようです)

したがって、その特定のケースでは、バックグラウンド コールの方が優れていました。一般的な用途では、直接呼び出しの方が適しています。

于 2010-07-21T15:58:31.710 に答える
1

パフォーマンスを向上させる最善の方法は、トリガーが呼び出す SQL CLR ストアド プロシージャに含まれるメソッドのコードを最適化することです。それについてもっと情報を投稿できますか?

于 2010-07-21T14:59:10.890 に答える