C#性能优化:动态创建对象

C#主要支持 5 种动态创建对象的方式:

1.Type.InvokeMember2.ContructorInfo.Invoke3.Activator.CreateInstance(Type)4.Activator.CreateInstance(assemblyName, typeName)5.Assembly.CreateInstance(typeName)

最快的是方式 3 ,与 Direct Create 的差异在一个数量级之内,约慢 7 倍的水平。其他方式,至少在 40 倍以上,最慢的是方式 4 ,要慢三个数量级。.

1.6.3 动态方法调用

方法调用分为编译期的早期绑定和运行期的动态绑定两种,称为Early-Bound Invocation和Late-Bound Invocation。Early-Bound Invocation可细分为Direct-call、Interface-call和Delegate-call。Late-Bound Invocation主要有Type.InvokeMember和MethodBase.Invoke,还可以通过使用LCG(Lightweight Code Generation)技术生成IL代码来实现动态调用。

从测试结果看,相比Direct Call,Type.InvokeMember要接近慢三个数量级;MethodBase.Invoke虽然比Type.InvokeMember要快三 倍,但比Direct Call仍慢270倍左右。可见动态方法调用的性能是非常低下的。我们的建议是:除非要满足特定的需求,否则不要使用!

1.6.4 推荐的使用原则

模式

1. 如果可能,则避免使用反射和动态绑定

2. 使用接口调用方式将动态绑定改造为早期绑定

3. 使用Activator.CreateInstance(Type)方式动态创建对象

4. 使用typeof操作符代替GetType调用

反模式

1. 在已获得Type的情况下,却使用Assembly.CreateInstance(type.FullName)