2010-07-21 73 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