C 中使用反射的效能分析

2021-09-05 13:52:07 字數 1831 閱讀 2638

**:

今天在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嘗試了一些簡單的反射,但是很顯然的,反射得消耗是非常大的。

C 中使用反射的效能分析

public void test1 private double a public double geta 首先我們對於物件的構造進行測試 測試 如下 private void test1 timespan spand datetime.now now label1.text time past s...

如何在 C 中使用 反射

c 中的反射常用於在程式的執行時獲取型別的元資料,可獲取的資訊包括已載入到程序中的程式集和型別資訊,它和 c 中的rtti runtime type information 的作用是差不多的。為了能夠使用反射,需要在專案中引用system.reflection命名空間,在使用反射的開始,你會獲取乙個...

C 反射效能測試

1.反射序列化與動態編譯序列化。比較結果 test started assembly pixysoft.framework.configurations.dll begin createobjectusingreflection begin createobjectusingreflection 0...