编写高质量代码改善程序的157个建议:使用Dynamic来简化反射的实现
最近有时间看点书了,把157个建议在重新看一遍,代码都调试一遍。当我看到第15个建议的时候有些出入,就记录下来,欢迎大家来探讨。
第十五条建议是,使用dynamic简化反射的使用,如果是针对这句话来讲,没问题,是正确的。dynamic的确可以简化反射的使用,但是从性能上来说是有条件的,可以根据自己情况选择。
我按着书上的代码,原封不动的敲了一遍,如下:
class Program
{
static void Main(string[] args)
{
int times = ;
DynamicSample dynamicSample = new DynamicSample();
var addMethod = typeof(DynamicSample).GetMethod("Add"); Stopwatch watch1 = Stopwatch.StartNew();
int result = ;
for (int i = ; i < times; i++)
{
result = (int)addMethod.Invoke(dynamicSample, new object[] { , });
}
Console.WriteLine(string.Format("正常的反射耗时:{0}毫秒", watch1.ElapsedMilliseconds)); Console.WriteLine("正常反射的结果:"+result); dynamic dynamicSample2 = new DynamicSample();
int result2 = ;
Stopwatch watch2 = Stopwatch.StartNew();
for (int i = ; i < times; i++)
{
result2 = dynamicSample2.Add(, );
}
Console.WriteLine(string.Format("Dynamic的反射耗时:{0}毫秒", watch2.ElapsedMilliseconds)); Console.WriteLine("Dynamic反射的结果:"+result2); DynamicSample reflectSamplebetter = new DynamicSample();
var addMethod2 = typeof(DynamicSample).GetMethod("Add");
var delg = (Func<DynamicSample, int, int, int>)Delegate.CreateDelegate(typeof(Func<DynamicSample, int, int, int>), addMethod2);
int result3 = ;
Stopwatch watch3 = Stopwatch.StartNew();
for (int i = ; i < times; i++)
{
result3=delg(reflectSamplebetter,,);
}
Console.WriteLine(string.Format("优化的反射耗时:{0}毫秒", watch3.ElapsedMilliseconds)); Console.WriteLine("优化的反射结果:"+result3);
Console.Read();
}
}
对了,还有我们的测试实体类:
public class DynamicSample
{
public string Name { get; set; } public int Add(int a, int b)
{
return a + b;
}
}
我们都知道反射是有损性能的,无论是使用正常反射还是dynamic都是不好的,尽量不要使用,这是我的建议。
如果非要用反射,就性能来讲,三者之间也是有选择的,不是说dynamic就是好的,如果就简化反射来说是好的,但是性能并不是那么好。
我先测试一下:一次循环的结果如下

很明显,正常的反射和优化后的反射要好,dynamic就差点了,在测试10000次循环:

在一万次循环的情况下,优化后的反射依然那么给力,正常反射的性能也不错,dynamic就差很多了。
我们再看看十万次循环怎么样?这次测试三次,看看每次的结果。
100000次第一次测试结果:

100000次第二次测试:

100000次第三次测试:

十万次测试,总体上来看,性能最好的还是优化后的反射,正常的反射要好一点,dynamic是最差的。
最后测试一百万次循环,第一次测试结果:

百万第二次,看看结果:

总体上来看,百万循环,dynamic的好处才看到,性能也不错,又简化反射的使用,性能最好还是优化后翻身,大家明白了吧,不是任何时候dyanmic都是有用的。
好了,就记录这么多吧,可能测试的不全面,希望大家包涵。
选择条件是,反射能不用就不用,如果注重性能,优化后的反射使用方法是最好的,如果不是很复杂,用正常反射就可以,除非循环真的要那么多次,但是dynamic是真的可以简化反射使用,对性能是分条件的。
编写高质量代码改善程序的157个建议:使用Dynamic来简化反射的实现的更多相关文章
- 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型
今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...
- Java编写高质量代码改善程序的151个建议
第一章 Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混淆的字母: (i.l.1:o.0等). 建议2:莫让常量蜕变成变量: (代码运行工程中不要改变常量值). 建议3:三元操作符 ...
- 编写高质量代码改善C#程序的157个建议[1-3]
原文:编写高质量代码改善C#程序的157个建议[1-3] 前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理 ...
- 读书--编写高质量代码 改善C#程序的157个建议
最近读了陆敏技写的一本书<<编写高质量代码 改善C#程序的157个建议>>书写的很好.我还看了他的博客http://www.cnblogs.com/luminji . 前面部 ...
- 编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试
建议157:从写第一个界面开始,就进行自动化测试 如果说单元测试是白盒测试,那么自动化测试就是黑盒测试.黑盒测试要求捕捉界面上的控件句柄,并对其进行编码,以达到模拟人工操作的目的.具体的自动化测试请学 ...
- 编写高质量代码改善C#程序的157个建议——建议156:利用特性为应用程序提供多个版本
建议156:利用特性为应用程序提供多个版本 基于如下理由,需要为应用程序提供多个版本: 应用程序有体验版和完整功能版. 应用程序在迭代过程中需要屏蔽一些不成熟的功能. 假设我们的应用程序共有两类功能: ...
- 编写高质量代码改善C#程序的157个建议——建议155:随生产代码一起提交单元测试代码
建议155:随生产代码一起提交单元测试代码 首先提出一个问题:我们害怕修改代码吗?是否曾经无数次面对乱糟糟的代码,下决心进行重构,然后在一个月后的某个周一,却收到来自测试版的报告:新的版本,没有之前的 ...
- 编写高质量代码改善C#程序的157个建议——建议154:不要过度设计,在敏捷中体会重构的乐趣
建议154:不要过度设计,在敏捷中体会重构的乐趣 有时候,我们不得不随时更改软件的设计: 如果项目是针对某个大型机构的,不同级别的软件使用者,会提出不同的需求,或者随着关键岗位人员的更替,需求也会随个 ...
- 编写高质量代码改善C#程序的157个建议——建议153:若抛出异常,则必须要注释
建议153:若抛出异常,则必须要注释 有一种必须加注释的场景,即使异常.如果API抛出异常,则必须给出注释.调用者必须通过注释才能知道如何处理那些专有的异常.通常,即便良好的命名也不可能告诉我们方法会 ...
随机推荐
- mysql 优化方法
1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽 ...
- javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之二 基础Hibernate框架搭建篇
我们在搭建完Struts框架之后,从前台想后端传送数据就显得非常简单了.Struts的功能不仅仅是一个拦截器,这只是它的核心功能,此外我们也可以自定义拦截器,和通过注解的方式来更加的简化代码. 接下来 ...
- SQL*Plus快速入门
连接数据库sqlplus hr@\"//mymachine.mydomain:port/MYDB\" --连接到MYDB数据库的一个HR数据集里sqlplus hr@MYDB -- ...
- JS的Dom树小结
一[DOM树节点] DOM节点分为三大类:元素节点.文本节点.属性节点 文本节点.属性节点,为元素节点的两个子节点: 通过getElement系列方法,可以去到元素节点. 二[查看节点] ...
- Docker - 在Ubuntu16.04中安装Docker CE
Get Docker for Ubuntu Check system version root@Ubuntu16:~# uname -a Linux Ubuntu16 4.8.0-36-generic ...
- 用Python设计一个经典小游戏
这是关于Python的第9篇文章,介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习 ...
- 【wannacry病毒之暗网】-如何访问"暗网"(慎入)
心里能力不强的人,请别看. 有些事情还是不要接触比较好, 社会最恶一面不是随随便便就能接触到的, 也不是你能理解的 你想要用暗网做什么是你考虑的一个问题 什么是暗网? 所谓的"暗网" ...
- int类型和byte类型的强制类型转换
今天在读<Java网络编程>这本书的第二章 流 时,看到书中有一个地方关于int强制转换为byte类型时应注意的地方.这个地方有点细节,不过就应该把这种细节把握住. 情况是这样的,讲到In ...
- 【JAVAWEB学习笔记】19_事务
事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...
- spring-定时器(2)
Spring提供的三种定时任务机制及其比较 定时任务的需求在众多应用系统中广泛存在,在Spring中,我们可以使用三种不同的定时机制,下面一一描述并加以比较 1. 基于Quartz的定时机制 下面详细 ...