• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

业余清洁工

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

问题记录,关于.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算法)

posted on 2012-07-23 18:46  业余清洁工  阅读(552)  评论(1)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3