2010-02-02 27 views
2

比方說,我有成千上萬個對象的集合,所有這一切的實現如下:使用「無所事事」默認事件處理程序是否有任何性能缺陷?

public event EventHandler StatusChanged = (s,e) => {}; 
private void ChangeStatus() 
{ 
    StatusChanged(this, new EventArgs()); 
} 

如果沒有處理程序訂閱了該事件的每個對象,並使用無操作的事件處理程序提供任何性能缺點?還是CLR聰明到可以忽略它?或者我最好在開火之前檢查一個StatusChanged處理程序?

回答

2

是的,CLR不夠聰明,無法忽略它,但在大多數情況下,差異應該可以忽略不計。

方法調用不是什麼大不了的事情,不太可能對應用程序的性能產生有意義的影響。

+0

如果我說5000個對象可能同時觸發事件會怎麼樣?會有什麼明顯的效果? – Marcus 2010-02-02 12:24:44

+0

@Marcus:對於3GHz處理器來說5000不是一個很大的數字,但如果你擔心,請檢查無效,而不是添加空處理程序。 – 2010-02-02 12:30:46

+0

@Marcus:只有分析器可以回答這個問題。 – 2010-02-02 12:31:06

1

如果您的應用程序每秒調用ChangeStatus一千次,那可能會出現問題。但只有剖析器可以證明這一點。

+2

我同意只有一個分析器可以肯定地判斷這是否是性能問題。但我總是發現添加一個空的事件處理程序的做法只是爲了避免檢查null是黑客行爲。然後,我再次寫出對性能敏感的代碼,所以我的觀點可能有點偏差。 – Pepor 2010-02-02 12:45:46

+0

@Pepor:不能同意更多。雖然大多數時候性能方面的問題都不太可能發生,但這只是一個黑客組織。 – 2010-02-02 12:47:25

相關問題