也谈枚举ToString()性能的改进
来源:互联网 发布:自学java三个月找工作 编辑:程序博客网 时间:2024/06/06 16:42
也谈枚举ToString()性能的改进
昨天看到 “性能相差7千倍的ToString方法”这篇文章,对于作者这种良好的性能意识和探索精神很佩服,以前还真没注意到这点。
不过,用switch的做法,个人觉得虽然性能上去了,但是可维护性就下来了,以后该枚举要增加或删除一项,这段switch代码都要改一下,其实该问题的关键就是反射带来的性能损耗,在调用枚举的ToString()方法时,无非就是要得到一个字符串而已,我个人更倾向于用key-value这种经典的键值对来优化。
下面是示例代码:
public static class TestClass { public static Dictionary<int, string> EnumLoginErrorNames = new Dictionary<int, string>(); //静态私有构造器 static TestClass() { AddEnumLoginErrorToDic(); //自动将枚举放入对应的字典中 } public enum EnumLoginError { 用户名不存在, 密码错误, 用户被锁定, 未知错误 } private static void AddEnumLoginErrorToDic() { string[] _names = Enum.GetNames(typeof(EnumLoginError)); int[] _values = Enum.GetValues(typeof(EnumLoginError)) as int[]; for (int i = 0; i < _values.Length; i++) { EnumLoginErrorNames.Add(_values[i], _names[i]); } } }
这样处理后的性能测试代码:(asp.net页中测试的,主要只是对比一下跟传统ToString方法的差异而已)
protected void Page_Load(object sender, EventArgs e) { Stopwatch sw = new Stopwatch(); int _max = 1000000,i=0; string _temp = TestClass.EnumLoginErrorNames[(int)TestClass.EnumLoginError.用户被锁定];//先调用一次,以便预热 //Dictionary方法 计时开始 sw.Start(); for (i = 0; i < _max; i++) { _temp = TestClass.EnumLoginErrorNames[(int)TestClass.EnumLoginError.用户被锁定]; } sw.Stop(); Debug.WriteLine("Dictionary方法耗时:" + sw.ElapsedMilliseconds); sw.Reset(); //反射方法 计时开始 sw.Start(); for (i = 0; i < _max; i++) { _temp = TestClass.EnumLoginError.用户被锁定.ToString(); } sw.Stop(); Debug.WriteLine("反射方法 耗时:" + sw.ElapsedMilliseconds); }
在我的本本上跑出来的测试结果如下:
Dictionary方法耗时:28
反射方法 耗时:1384
效果还是比较明显的,相对于switch方法而言,没有将结果字符串硬编码在处理函数中,以后枚举中增加或删除某一项,也不影响调用代码,可维护性相对更好一些。但是也应该看到,这是一种空间换时间的做法,避开了反射,但是系统需要额外存储一个字典对象,占用的内存要比原来多一些。
最后:本文仅为技术探讨,没有哪个最好之说,具体如何使用,大家自己酌情考虑。
- 也谈枚举ToString()性能的改进
- 也谈"对MemoryStream的一些改进"
- ToString()对性能的影响
- 隔振器性能的改进
- .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法
- 改进托管代码的性能
- SSIS----改进数据流的性能
- 转码性能的改进
- 几种toString的性能比较
- 谁在关心toString的性能?
- Java toString的性能优化方案比较
- 谁在关心toString的性能?
- 也说DateTime.ToString()
- 也谈内联脚本的位置对性能的影响
- 也谈程序性能测试
- 改进 ASP 的字符串处理性能
- 怎样改进数据库的查询性能?
- 关注性能: 改进您的开发过程
- java异常处理
- Delphi中模态窗口切换时隐藏问题的解决办法
- 十四.创建一个spinner下拉列表
- 如何稳定的使用google浏览器
- android permission大全(各种权限)
- 也谈枚举ToString()性能的改进
- 白天求生存,晚上谋发展
- 整理 使用usb术语详解
- 杭电 2824 筛法求欧拉函数的和
- 程序员其实最需要安全感(原创)
- 跟我一起写 Makefile(十一)
- 人的一生会遇上的四个人
- Android NDK 开发环境搭建
- MySQL 数据类型 详解