也谈枚举ToString()性能的改进
时间:2022-04-23
本文章向大家介绍也谈枚举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方法而言,没有将结果字符串硬编码在处理函数中,以后枚举中增加或删除某一项,也不影响调用代码,可维护性相对更好一些。但是也应该看到,这是一种空间换时间的做法,避开了反射,但是系统需要额外存储一个字典对象,占用的内存要比原来多一些。
最后:本文仅为技术探讨,没有哪个最好之说,具体如何使用,大家自己酌情考虑。
- STOMP协议介绍
- ADO.NET实体框架连接串引发的异常:Unable to load the specified metadata resource
- Mono产品生命周期
- WordPress免插件仅代码实现文章归档模板 II
- Paket 介绍
- C语言学不会,编程能力无法提升?你的问题我来解决!
- 实现WCF和Unity 的集成
- Qt中纯C++项目发布为dll的方法(超详细步骤)
- .NET的Actor模型:Orleans
- UML:类图复习-鸡生蛋,蛋生鸡
- DotNet多个程序集合并工具
- Spring官网下载dist.zip的几种方法
- Spring Security笔记:HTTP Basic 认证
- WordPress免插件仅代码实现文章浏览次数的方法(1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter-初试牛刀,入门篇
- JS获取图片URL并截取文件名和后缀
- 10X genomics bam文件的格式
- Flutter性能优化
- PWN - Use After Free
- windows环境的python踩坑记
- uniapp上传图片至服务器,获得在线图片链接预览(实战)
- linux中的字符串切片
- 视频配音篇,如何使用百度翻译将文本转换为mp3语音?
- Objective-C的hook方案/ Method Swizzling
- Python爬虫:无账号无限制获取企查查信息
- Spark Streaming——Spark第一代实时计算引擎
- bamtools分割bam文件
- 在genome browser中添加自己的注释文件
- 原理+代码|Python基于主成分分析的客户信贷评级实战