C 中使用反射的效能分析

2021-06-07 12:28:15 字數 1650 閱讀 4783

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...