问题记录,关于.net性能,几个需要了解的问题(已有答案)
1 .net4.0中dynamic调用方法快,还是反射调用方法快,还是emit动态代理快,还是表达式树快,还是委托调用快(委托最快?其次呢,多次调用(emit>表达式树=dynamic>反射)?单次调用(反射>dynamic>表达式树)
2 Dictionary<TKey,TValue>中哪种key快,数字,guid,结构,对象,字符串(数字〉对象 〉guid〉结构〉字符串?)
3 怎么能尽量少的产生封箱解封操作(范型?)
欢迎大家讨论,对于1,2有时间偶一定做个测试
问题1测试答案:
调用某对象的int Add(int x,inty)方法
结果如下:
单次 百万次 千万次 一亿次
0.0010001 原生 0.0210012 00.1700097 01.5620893
0.0010001 invoke 1.9531118 19.0390889 03:13.6530764
0.0720041 emit 0.4140237 03.1731815 30.6967557
0 委托 0.0250015 00.1520087 01.5060862
0.1560089 dynamic 0.2870164 01.0190583 08.0334595
其中数字为时间间隔小数点前面单位为妙
我们看到了:
单次调用结果:委托〉原生=反射〉dynamic〉emit(优化后接近委托)
多次调用结果:委托〉原生〉dynamic〉emit(优化后超越dynamic2.5倍左右,但是咋优化是个问题!)〉反射(反射很悲剧)
结论:大家放心使用dynamic吧,必须要用反射的时候可以用emit代替反射invoke所有功能,如果只是invoke还可以考虑dynamic的il实现方式,后期绑定:System.Runtime.CompilerServices.CallSite<T>,做好优化,Emit才是王道(所谓优化就是裸奔,未优化就是封装,测试数据是封装后得到的)
问题2答案:
Dictionary(对象,结构,字符串三种key速度差不多,查询速度取决于对象的复杂度,越复杂越慢,本质上查询速度取决于各对象的hash算法)
浙公网安备 33010602011771号