public void test1()
private double a;
public double geta() }}
首先我們對於物件的構造進行測試
測試**如下
private void test1()
}timespan spand = datetime.now - now;
label1.text = "time past " + spand.tostring();
}private void test2()
}timespan spand = datetime.now - now;
label2.text = "time past " + spand.tostring();
}測試結果直接呼叫的時間為16ms左右,而反射呼叫的則始終維持在5s 520ms左右,直接效率比較接近350倍。
對於這個測試,很有趣的一點是:
如果將test2中的type thetest = type.gettype("reflectiontest.test.ctester");
移到迴圈之外,則相應的執行時間下降為1s 332 ms , 效率相差為20倍左右。
接下來我們對成員函式呼叫進行了測試:
test1:
private void button1_click(object sender, eventargs e)
}timespan spand = datetime.now - now;
label1.text = "time past " + spand.tostring();
label3.text = "value is now " + atest.geta();
}test2:
private void button2_click(object sender, eventargs e)
}ctester thewar = theobj as ctester;
timespan spand = datetime.now - now;
label2.text = "time past " + spand.tostring();
label4.text = "value is now " + thewar.geta();
}這個例子僅僅使用了invoke member進行測試
初步得到的資料如下:
test1 : 10 ms
test2: 2m 53ms
多次測試,得到的資料有輕微的波動,但是基本上的比例維持在1:250左右
對於靜態方法呼叫
結果為5ms - 3m 164ms
用ildasm檢視聲稱的il**,發現除了函式呼叫外,聲稱的**基本一致,可見效能的差別是由
callvirt instance object [mscorlib]system.type::invokemember(string,
valuetype [mscorlib]system.reflection.bindingflags,
class [mscorlib]system.reflection.binder,
object,
object)
導致的,也就是反射引起的效能損失。
雖然只用invokemember嘗試了一些簡單的反射,但是很顯然的,反射得消耗是非常大的。
C 中使用反射的效能分析
今天在mvp站點上看到有人說反射的效能很差,要避免使用,就寫了乙個簡單的例子測試了一下。測試類如下 被遮蔽廣告 namespace reflectiontest.test public void test1 private double a public double geta 首先我們對於物件的構...
如何在 C 中使用 反射
c 中的反射常用於在程式的執行時獲取型別的元資料,可獲取的資訊包括已載入到程序中的程式集和型別資訊,它和 c 中的rtti runtime type information 的作用是差不多的。為了能夠使用反射,需要在專案中引用system.reflection命名空間,在使用反射的開始,你會獲取乙個...
C 反射效能測試
1.反射序列化與動態編譯序列化。比較結果 test started assembly pixysoft.framework.configurations.dll begin createobjectusingreflection begin createobjectusingreflection 0...