先上測試代碼
成都網站制作公司哪家好,找創(chuàng)新互聯建站!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、成都響應式網站建設等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯建站于2013年創(chuàng)立到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯建站。
using System.Text; namespace Model { public partial class Class1 { public Class1() { } private string _s = ""; private int _i = 0; private decimal _d = 0; private StringBuilder _sb = new StringBuilder(); public string S { set { _s = value; } get { return _s; } } public int I { set { _i = value; } get { return _i; } } public decimal D { set { _d = value; } get { return _d; } } public StringBuilder SB { set { _sb = value; } get { return _sb; } } public int func() { int s = 0; for (int i = 0; i < 1000; i++) { s = s + i; } return s; } } } /////////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Text; using Model; using System.Reflection; using System.Diagnostics; namespace testReflect { class Program { static void Main(string[] args) { const int count = 100000; Console.WriteLine("count="+count); Stopwatch sw = new Stopwatch(); StringBuilder test = new StringBuilder(); sw.Restart(); for (int i = 0; i < count; i++) { Class1 m = new Class1(); m.D = 100; m.I = 200; m.S = "string"; m.SB = new StringBuilder("StringBuilder"); test.Append(m.D); test.Append(m.I); test.Append(m.S); test.Append(m.SB); } sw.Stop(); Console.WriteLine("直接創(chuàng)建,賦值并訪問內存中對象屬性: " + sw.ElapsedTicks); //Console.WriteLine("直接創(chuàng)建,賦值并訪問內存中對象屬性: " + sw.ElapsedTicks); long basic = sw.ElapsedTicks; sw.Restart(); test = new StringBuilder(); for (int i = 0; i < count; i++) { var t = typeof(Class1); ConstructorInfo ct = t.GetConstructor(new Type[] { }); var m = ct.Invoke(null); PropertyInfo pd = t.GetProperty("D"); pd.SetValue(m, 100m, null); PropertyInfo pi = t.GetProperty("I"); pi.SetValue(m, 200, null); PropertyInfo ps = t.GetProperty("S"); ps.SetValue(m, "string", null); PropertyInfo psb = t.GetProperty("StringBuilder"); PropertyInfo[] props = m.GetType().GetProperties(); foreach (var p in props) { test.Append(p.GetValue(m, null)); } } sw.Stop(); Console.WriteLine("反射創(chuàng)建,賦值并訪問內存中對象屬性: " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")"); test = new StringBuilder(); sw.Restart(); for (int i = 0; i < count; i++) { dynamic dm = new Class1(); dm.D = 100; dm.I = 200; dm.S = "string"; dm.SB = new StringBuilder("StringBuilder"); test.Append(dm.D); test.Append(dm.I); test.Append(dm.S); test.Append(dm.SB); } sw.Stop(); Console.WriteLine("dynamic直接創(chuàng)建,賦值并訪問內存中對象屬性:" + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")"); test = new StringBuilder(); sw.Restart(); for (int i = 0; i < count; i++) { var t = typeof(Class1); ConstructorInfo ct = t.GetConstructor(new Type[] { }); dynamic dm = ct.Invoke(null); dm.D = 100; dm.I = 200; dm.S = "string"; dm.SB = new StringBuilder("StringBuilder"); test.Append(dm.D); test.Append(dm.I); test.Append(dm.S); test.Append(dm.SB); } sw.Stop(); Console.WriteLine("dynamic反射創(chuàng)建,賦值并訪問內存中對象屬性:" + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")"); test = new StringBuilder(); sw.Restart(); for (int i = 0; i < count; i++) { Class1 m = new Class1(); test.Append(m.func()); } sw.Stop(); Console.WriteLine("直接調用內存中對象方法: " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")"); sw.Restart(); test = new StringBuilder(); for (int i = 0; i < count; i++) { var t = typeof(Class1); MethodInfo meth = t.GetMethod("func"); ConstructorInfo ct = t.GetConstructor(new Type[] { }); test.Append(meth.Invoke(ct.Invoke(null), null)); } sw.Stop(); Console.WriteLine("反射調用內存中對象方法: " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")"); test = new StringBuilder(); sw.Restart(); for (int i = 0; i < count; i++) { dynamic dm = new Class1(); test.Append(dm.func()); } sw.Stop(); Console.WriteLine("dynamic直接調用內存中對象方法:" + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")"); test = new StringBuilder(); sw.Restart(); for (int i = 0; i < count; i++) { var t = typeof(Class1); ConstructorInfo ct = t.GetConstructor(new Type[] { }); dynamic dm = ct.Invoke(null); test.Append(dm.func()); } sw.Stop(); Console.WriteLine("dynamic反射調用內存中對象方法:" + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")"); Console.WriteLine("###############################"); sw.Restart(); test = new StringBuilder(); for (int i = 0; i < count; i++) { Assembly a = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"\Model.dll"); var t = a.GetType("Model.Class1"); ConstructorInfo ct = t.GetConstructor(new Type[] { }); var rm = ct.Invoke(null); PropertyInfo pd = t.GetProperty("D"); pd.SetValue(rm, 100m, null); PropertyInfo pi = t.GetProperty("I"); pi.SetValue(rm, 200, null); PropertyInfo ps = t.GetProperty("S"); ps.SetValue(rm, "string", null); PropertyInfo psb = t.GetProperty("SB"); psb.SetValue(rm, new StringBuilder("StringBuilder"), null); PropertyInfo[] props = t.GetProperties(); foreach (var p in props) { test.Append(p.GetValue(rm, null)); } } sw.Stop(); Console.WriteLine("使用反射加載程序集,創(chuàng)建,賦值,訪問,對象屬性: " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")"); sw.Restart(); test = new StringBuilder(); for (int i = 0; i < count; i++) { Assembly a = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"\Model.dll"); var t = a.GetType("Model.Class1"); ConstructorInfo ct = t.GetConstructor(new Type[] { }); dynamic dm = ct.Invoke(null); dm.D = 100m; dm.I = 200; dm.S = "string"; dm.SB = new StringBuilder("StringBuilder"); test.Append(dm.D); test.Append(dm.I); test.Append(dm.S); test.Append(dm.SB); } sw.Stop(); Console.WriteLine("dynamic賦值,使用反射加載程序集,創(chuàng)建,賦值,訪問,對象屬性: " + sw.ElapsedTicks + "(" + sw.ElapsedTicks / basic + ")"); } } }
分別循環(huán)1000,10000,50000,100000次
所得到的數據顯示,直接創(chuàng)建賦值是快速的方法。
反射創(chuàng)建所需要的時間比依次是9x,15x,15x,15x
對于兩種dynamic,
所需的時間比依次是36,8,3,2和7,4,3,3。說明了在反復調用次數少的情況下,dynamic方式并不優(yōu)于反射,但是在反復調用次數多的情況下,使用dynamic方式優(yōu)于直接使用反射。兩種dynamic方式在調用次數多的情況下,差距也不是很多
對于方法的調用,發(fā)現,時間比都差不多。反射稍慢一點。dynamic方式略占優(yōu)勢。
對于加載assembly的方式,絕對是最慢的,通常要在100-150倍左右。
此處我想強調的是,雖然速度差別很大,但是通常的代碼運行很少有循環(huán)1000次10000次的。即便有,其絕對值還是很小的。相對網絡延遲開銷,反射所花去的開銷可以忽略不計。因此,因為性能問題拒絕反射是愚蠢的。使用dynamic類型,相對反射來說,代碼可以寫的更優(yōu)雅。
以上數據,僅供參考。
網頁標題:直接方式,反射方式,dynamic方式性能比較
網站地址:http://sd-ha.com/article30/gegipo.html
成都網站建設公司_創(chuàng)新互聯,為您提供網站制作、、域名注冊、手機網站建設、動態(tài)網站、自適應網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯