调用方法的最快方法

aba*_*hev 0 .net c# lambda delegates method-call

阅读本文后,我发现了几种调用方法的方法.

致电方法:

public static void SendData(string value) { }
Run Code Online (Sandbox Code Playgroud)

呼叫:

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);
Run Code Online (Sandbox Code Playgroud)

这是真的吗?它更快吗?

Action send = () => Send("Update");
send();
Run Code Online (Sandbox Code Playgroud)

或许这个?

我需要将一个方法调用到具有最高性能的SQL CLR触发器中,因此即使很小的速度增加也是有意义的.

Eri*_*ert 20

哪个"更快"?

1)让鲍勃修剪你的草坪.等到他完成了.然后去商场.

2)让鲍勃修剪你的草坪.在他修剪你的草坪时去商场.

第二种技术可以让您更快地进入商场.您支付的价格是,您不知道在您回家的时候草坪是否会被修剪.使用第一种技术,您知道当您从商场回家时,草坪将被修剪,因为您等到它离开之前就已经开始了.如果你的逻辑取决于你知道在你回来的时候修剪草坪,那么第二种技术是错误的.

现在重要一点:显然,这两种技术都没有让你的草坪比另一种割得更快. 当你问"哪个更快?" 你必须指明哪些操作你测量的速度.

  • 现在如果Alice想要给Bob发送消息怎么办?(J/K) (6认同)

Jus*_*ner 13

使用委托并不比直接调用方法快(在所有情况下,创建委托然后调用它会更昂贵).

这看起来更快的原因是因为在方法运行时直接调用该方法会阻塞正在执行的线程.您的委托示例异步调用该方法(使用BeginInvoke),因此调用线程在执行该方法时继续执行.

此外,每当您在委托上调用BeginInvoke时,您还应该具有相应的EndInvoke,您在示例中缺少该EndInvoke:

EndInvoke()是可选的,sort-of optional,还是绝对不是可选的?

IanG on Tap:EndInvoke不可选