2010-07-21 75 views
0

阅读this article我找到了几种调用方法的方法。调用方法的最快方法

方法来调用:

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触发器以获得最大性能,所以即使小的速度增加也是有意义的。

+2

如果你考虑一下,不直接调用方法调用调用方法的最快方法是什么? CLR针对常见情况进行了大量优化 - 直接方法调用。让委托调用比直接方法调用更快是没有意义的。 – thecoop 2010-07-21 15:10:04

+0

为什么downvote没有评论? – abatishchev 2013-02-03 08:42:49

回答

20

哪个“更快”?

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

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

第二种技术让您更快地到商场。你付出的代价是,你不知道在你回家的时候草坪是否会被割草。通过第一种技术,您知道知道,当您从商场回到家时,草坪将被割草,因为您一直等到它离开之前。如果你的逻辑取决于在知道草坪被割草的时候你回来了,那么第二种技术是错误

现在的重要一点:显然这两种技术都不能让你的草坪修剪得更快。当你问“哪个更快?”你必须指明你正在测量什么操作的速度。

+6

现在如果Alice想给Bob发送消息呢? (j/k) – 2010-07-21 16:10:05

+0

@ JesseC.Slicer这很简单。只需创建一个全新的“cryptografically super securez(TM)”系统,而不是依赖现有的交换机制。 – 2016-03-15 19:37:10

+0

@MateenUlhaq把你自己的割草机认为是有害的。 – 2018-01-11 04:38:07

13

使用委托并不比直接调用方法快(实际上,创建委托然后调用它会更昂贵)。

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

而且,只要你有BeginInvoke的调用上的委托,你也应该有相应的EndInvoke会,你会在你的榜样缺失:

Is EndInvoke() optional, sort-of optional, or definitely not optional?

IanG on Tap: EndInvoke Not Optional

+0

我相信调用委托的速度与在接口上调用方法的速度大致相同(因为所有指针与方法表和对象查找都在一起)。不记得我在哪里阅读这个,虽然 – thecoop 2010-07-21 15:06:17

+0

@thecoop - 但你仍然必须增加创建委托的开销,而不仅仅是调用它。 – 2010-07-21 15:08:00

+1

在这个例子中选择一个'ThreadPool'线程的开销。 – 2010-07-21 15:12:17

2

SendData返回给调用者的角度来看,它的安慰剂速度有所提高。 BeginInvoke将采用ThreadPool线程并在该线程上启动该方法,然后立即返回给调用者 - 实际工作在另一个线程上。无论线程开启,完成这项工作所需的时间将保持不变。它可以提高应用程序的响应速度,具体取决于工作,但代表并不比直接方法调用快 - 正如我所说,在您的情况下,它看起来更快,因为它会立即返回。

尝试此操作:将BeginInvoke更改为Invoke - 呼叫者现在阻止,正常情况下调用SendData

假设代码注释不是你的(即“推荐用于生产”),我会很快找到开发人员负责,并确保他们知道Delegate.BeginInvoke以及他们正在让他们的应用程序多线程而不知道它的事实...

要回答这个问题,直接方法调用总是最快的方式 - 代表或反射会产生开销。

1

提高性能的最佳机会是优化触发器将调用的SQL CLR存储过程中的方法中的代码。你能发布更多关于这方面的信息吗?

+0

在这种情况下,CLR触发器不是调用CLR sp,而是调用WCF Web服务。用于测试目的。但最有可能的是,它会调用执行业务逻辑的十几种不同的方法(在订单状态改变的情况下)。 – abatishchev 2010-07-21 15:11:36

1

请注意,在您引用的文章中,作者正在讨论WCF调用,特别是插入和更新数据库的调用。

的关键点在特定情况下,需要注意的是:

  • 的工作是由另一台机器上完成。
  • 你回来的唯一信息是“成功!” (通常情况下)或(偶尔)“失败”(作者似乎不关心)

因此,在特定情况下,后台调用者为佳。对于一般用途,直接呼叫更好。

+0

据我可以理解的性能主题只是关于方法调用和其他 - 关于WCF调用 – abatishchev 2010-07-21 18:19:20