程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [C#] 謹慎使用DynamicInvoke

[C#] 謹慎使用DynamicInvoke

編輯:C#入門知識

Delegate類提供了一個變參接口DynamicInvoke(params object[] args),可以在委托的具體類型不可知的情況下通過反射來進行委托調用。很方便,但由於變參,而且使用了反射,對性能有極大的影響。 設計實驗: 定義一個委托(委托實例函數的內容為空,這個實驗僅為檢驗調用開銷,所以去掉了函數體,以避免額外干擾),對這個委托以不同的方式調用8×1024×1024次。 方案1——在明確委托類型的情況下直接調用委托 方案2——事先用一個Delegate變量承接委托實例,然後通過Delegate的DynamicInvoke方法調用委托 方案3——事先從委托中取出要調用的MethodInfo,然後通過MethodInfo的Invoke方法來調用委托 結果:方案1  約70ms,方案2  約8500ms ,方案3  約7500ms 很明顯,在確定委托類型的情況下調用委托,就只有一次函數調用的開銷,而通過Delegate類的DynamicInvoke反射調用委托就有了太多太多額外開銷,事先獲取委托的MethodInfo可以減少DynamicInvoke查找方法的那部分開銷,但是同確定類型時的委托調用效率還是無法相比。另外方案3中在調用MethodInfo的Invoke方法前還做了一次參數到object[]數組的轉化。因為Invoke方法只接受object[]參數,把這一步省掉的話,方案3的消耗可以降到6500ms左右,有好轉,但不多。 所以,在能夠確定委托類型的情況還是不要貪圖方便使用Delegate的DynamicInvoke來代替正常的委托調用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved