今天在mvp站點上看到有人說反射的效能很差,要避免使用,就寫了乙個簡單的例子測試了一下
測試類如下:
namespace reflectiontest.test
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嘗試了一些簡單的反射,但是很顯然的,反射得消耗是非常大的。
反射的效能
反射是乙個相當強大的機制,它允許我們在執行時構建並使用乙個在編譯時還不了解的型別及其成員。但它也有兩個缺點。使用反射呼叫乙個成員時,也會對效能產生影響。用反射呼叫乙個方法時,首先要將實參打包成乙個陣列,在內部,反射將這個陣列解包到執行緒棧上。此外,在呼叫方法前,clr要檢查實參的資料型別。最後,cl...
反射的效能
反射是相當強大的乙個機制,它允許在執行時發現並使用編譯時還補了解的型別或成員。但是,它有下面兩個缺點。1,反射會造成編譯時無法保證型別型別安全性。由於反射要嚴重依賴字串,所以會喪失編譯時的型別安全性。2,反射速度慢。使用反射時,型別或成員的名稱在編譯時未知 要用字串名稱標識每個型別及其成員,以便在執...
C 反射效能測試
1.反射序列化與動態編譯序列化。比較結果 test started assembly pixysoft.framework.configurations.dll begin createobjectusingreflection begin createobjectusingreflection 0...