亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談.NET反射機(jī)制的性能優(yōu)化 附實(shí)例下載

 更新時(shí)間:2012年04月07日 10:41:27   作者:  
在進(jìn)入解釋型模版引擎的探討之前,我決定先分享一下這篇博客。因?yàn)樵诮忉屝鸵胬飳敕瓷涞母拍顏韺?shí)現(xiàn)更多、更復(fù)雜的功能
可能大家談到反射面部肌肉都開始抽搐了吧!因?yàn)樵谕泄苷Z言里面,最臭名昭著的就是反射!它的性能實(shí)在是太低了,甚至在很多時(shí)候讓我們無法忍受。不過不用那么糾結(jié)了,老陳今天就來分享一下如何來優(yōu)化反射!

概述
本文涉及到的反射優(yōu)化的途徑有如下兩種:

通過Delegate.CreateDelegate()創(chuàng)建委托進(jìn)行優(yōu)化
通過.NET4的動(dòng)態(tài)運(yùn)行時(shí)進(jìn)行優(yōu)化
如果您還知道其他更加有效的優(yōu)化途徑,請不吝賜教!

準(zhǔn)備工作
今天我們總計(jì)要對比五種不同的調(diào)用對象成員的方式,也算是一種性能測評。

在開始之前,我們首先定義一個(gè)簡單的對象和一個(gè)方法,以供測試之用:
復(fù)制代碼 代碼如下:

namespace ReflectionOptimization
{
public sealed class TestObject
{
public int Add(int a, int b)
{
// 簡單演示
return a + b;
}
}
}

這個(gè)類非常簡單,只提供了一個(gè)方法,這個(gè)方法返回兩個(gè)整形的和。接下來我們看看執(zhí)行時(shí)間測量的代碼,很簡單,想必您已經(jīng)駕輕就熟了:
復(fù)制代碼 代碼如下:

private static double _Run(string description, Action<int, int> action, int a, int b)
{
if (action == null) throw new ArgumentNullException("action");

// 啟動(dòng)計(jì)時(shí)器
var stopwatch = Stopwatch.StartNew();

// 運(yùn)行要測量的代碼
action(a, b);

// 終止計(jì)時(shí)
stopwatch.Stop();

// 輸出結(jié)果
Console.WriteLine("{0}: {1}", description, stopwatch.Elapsed.TotalMilliseconds.ToString(CultureInfo.InvariantCulture));

// 返回執(zhí)行時(shí)間
return stopwatch.Elapsed.TotalMilliseconds;
}

以上測量時(shí)間的方法返回了執(zhí)行時(shí)間,因?yàn)槲覀円诤竺嬗玫竭@個(gè)值,在執(zhí)行多次之后取個(gè)平均值,以求測試的公平性、權(quán)威性。

編碼實(shí)現(xiàn)
首先我們來看看原生反射的實(shí)現(xiàn):
復(fù)制代碼 代碼如下:

var obj = new TestObject();
var add = obj.GetType().GetMethod("Add");

for (var i = 0; i < _TIMES; i++) add.Invoke(obj, new object[] {a, b});

然后我們看看.NET4動(dòng)態(tài)編程的實(shí)現(xiàn):
復(fù)制代碼 代碼如下:

dynamic obj = new TestObject();

// 有木有發(fā)現(xiàn)這個(gè)代碼超級簡單?
for (var i = 0; i < _TIMES; i++) obj.Add(a, b);

最后我們看看如何使用委托來優(yōu)化反射:
復(fù)制代碼 代碼如下:

// 委托
public delegate int AddMethod(int a, int b);

// 實(shí)現(xiàn)
var obj = new TestObject();
var objType = obj.GetType();
var add = objType.GetMethod("Add");
var d = (AddMethod)Delegate.CreateDelegate(typeof(AddMethod), obj, add);

for (var i = 0; i < _TIMES; i++) d(a, b);

上面的代碼看起來多了幾行,而且還需要自定義一個(gè)委托,寫起來挺麻煩的。因此我們的測試代碼里面還實(shí)現(xiàn)了另外一種形式,其實(shí)它也是委托:

var d = (Func<TestObject, int, int, int>)Delegate.CreateDelegate(typeof(Func<TestObject, int, int, int>), add);

測試總結(jié)
我們首先在Debug模式下將整個(gè)測試代碼運(yùn)行5遍,然后分別記錄平均值,然后再到Release模式下重復(fù)該測試。

測試的過程不再闡述,測試結(jié)果整理如下:

Debug模式:

調(diào)用方式 第一次 第二次 第三次 第四次 第五次
Generic Call 1.022425 1.012885 0.990775 1.020950 1.046880
Reflection 147.489220 146.012010 142.690080 139.189335 141.663475
dynamic 9.645850 9.979965 9.307235 9.532665 9.730030
Func 1.201860 1.214800 1.170215 1.189280 1.239485
Delegate 1.062215 1.061635 1.067510 1.047180 1.075190

Release模式:

調(diào)用方式 第一次 第二次 第三次 第四次 第五次
Generic Call 0.745600 0.741365 0.722145 0.732630 0.725645
Reflection 141.778260 142.855410 142.346095 139.649990 138.541285
dynamic 9.631460 10.341850 9.284230 9.457580 9.060470
Func 0.882100 0.852680 0.875695 0.854655 0.831670
Delegate 0.710280 0.722465 0.723355 0.727175 0.693320

點(diǎn)評&結(jié)論:

  • 使用委托優(yōu)化反射之后,其性能與直接調(diào)用相差無幾,保持在同一個(gè)數(shù)量級之內(nèi),對性能要求極度苛刻時(shí)推薦此方案;
  • 顯式委托(Delegate)和匿名委托(Func)性能差異非常不明顯,但顯式委托的性能還是好一點(diǎn); 
  • 原生委托比直接調(diào)用慢出了兩個(gè)數(shù)量級,性能差異達(dá)到了200倍之多!
  • .NET 4的動(dòng)態(tài)編程語法相當(dāng)簡潔,其性能只比直接調(diào)用高出一個(gè)數(shù)量級,由于其語法相當(dāng)簡潔,我們推薦這種做法!
  • 原生反射技術(shù)在Debug模式和Release模式下沒有太大差異,但其他方式有較為明顯的優(yōu)化效果(請思考為什么);
  • 雖然我們今天的測試不能完全意味著反射優(yōu)化之后可以和直接調(diào)用相媲美,但至少可以從某種程度上擊敗那些個(gè)謠言——誰說反射就一定會慢(嘻嘻)!

代碼下載:淺談反射優(yōu)化

相關(guān)文章

  • ASP.NET自帶對象JSON字符串與實(shí)體類的轉(zhuǎn)換

    ASP.NET自帶對象JSON字符串與實(shí)體類的轉(zhuǎn)換

    這篇文章主要介紹了ASP.NET自帶對象JSON字符串與實(shí)體類的轉(zhuǎn)換,感興趣的小伙伴們可以參考一下
    2016-07-07
  • ASP.NET Core應(yīng)用錯(cuò)誤處理之DeveloperExceptionPageMiddleware中間件呈現(xiàn)“開發(fā)者異常頁面”

    ASP.NET Core應(yīng)用錯(cuò)誤處理之DeveloperExceptionPageMiddleware中間件呈現(xiàn)“開發(fā)者

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core應(yīng)用錯(cuò)誤處理之DeveloperExceptionPageMiddleware中間件呈現(xiàn)“開發(fā)者異常頁面”的相關(guān)資料,需要的朋友可以參考下
    2019-01-01
  • LINQ to XML的編程基礎(chǔ)

    LINQ to XML的編程基礎(chǔ)

    本文介紹了LINQ to XML的編程基礎(chǔ),即System.Xml.Linq命名空間中的多個(gè)LINQ to XML類,這些類都是LINQ to XML的支持類,它們使得處理xml比使用其他的xml工具容易得多。在本文中,著重介紹的是XElement、XAttribute和XDocument。
    2010-02-02
  • C#可以減少或不使用switch有什么方法

    C#可以減少或不使用switch有什么方法

    減少或不使用switch,大家有什么好的方法,使用工廠方法來處理,可以創(chuàng)建一個(gè)工廠接口,然后每個(gè)方法設(shè)計(jì)為一個(gè)工廠類,并實(shí)現(xiàn)工廠接口,感興趣的朋友可以了解下
    2013-03-03
  • ASP.NET Core靜態(tài)文件使用教程(9)

    ASP.NET Core靜態(tài)文件使用教程(9)

    這篇文章主要為大家詳細(xì)介紹了ASP.NET Core靜態(tài)文件的使用教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • asp.net(C#)生成無限級別菜單

    asp.net(C#)生成無限級別菜單

    最近開發(fā)的一個(gè)項(xiàng)目中用到了無限級別菜單,因此將此代碼貼出來,以供研究,開發(fā)環(huán)境為VS2008+SQL 2000。
    2010-03-03
  • .net6環(huán)境下使用RestSharp請求GBK編碼網(wǎng)頁亂碼的解決方案

    .net6環(huán)境下使用RestSharp請求GBK編碼網(wǎng)頁亂碼的解決方案

    這篇文章介紹了.net6環(huán)境下使用RestSharp請求GBK編碼網(wǎng)頁亂碼的解決方案,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • C#圖片截取壓縮(百分比壓縮/大小壓縮)實(shí)現(xiàn)代碼

    C#圖片截取壓縮(百分比壓縮/大小壓縮)實(shí)現(xiàn)代碼

    為了娛樂寫了個(gè)截取圖片和壓縮圖片你的小工具:按照百分比壓縮/制定大小壓縮等等,感興趣的朋友可以了解下啊,希望本文對你學(xué)些c#圖片知識有所幫助
    2013-01-01
  • ASP.NET Core中的依賴問題解決方法示例

    ASP.NET Core中的依賴問題解決方法示例

    這篇文章主要為大家介紹了ASP.NET Core中的依賴問題解決方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • asp.net下PageMethods使用技巧

    asp.net下PageMethods使用技巧

    ASP.net AjAX中的PageMethods可以將靜態(tài)頁方法添加到 ASP.NET 頁中并將其用作 Web 方法。然后,無需創(chuàng)建單獨(dú)的 .asmx 文件即可從該頁中的腳本調(diào)用這些方法,就好像這些方法是 Web 服務(wù)的一部分。特別是在一些交互流程不復(fù)雜而調(diào)用次數(shù)和方法又比較多的情況下更為方便。因?yàn)镻ageMethods不需要我們再添加另外的WEB服務(wù)或Page來處理請求。
    2008-03-03

最新評論