编写高质量代码改善程序的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抛出异常,则必须给出注释.调用者必须通过注释才能知道如何处理那些专有的异常.通常,即便良好的命名也不可能告诉我们方法会 ...
随机推荐
- LeanCloud 调研报告
LeanCloud 是一家做后端即服务(BaaS)的厂商,目标是让移动互联网开发者能更加方便的开发应用. 出于工作关系,对 leancloud 进行了一番调研:主要目标是学习其后端即服务的产品化思路等 ...
- bzoj1087 [SCOI2005]互不侵犯
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- [进程管理]linux 下 进程和线程的区别(baidu 面试)
进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是CPU调度和分派的 ...
- css小细节罗列
有空时候把一些常见可能不是每个人都知道的css小细节总结了下,共勉. 1.line-height 众多周知,line-height是行高的意思,我们时常会使用类似line-height:24px;这样 ...
- mysql的一些使用操作
1:如果空闲时间很长导致mysql报错: Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last pa ...
- 工具类总结---(六)---之http及https请求
下面使用的是HttpURLConnection进行的网络链接,并对https进行了忽略证书. 在这个utils里面,也使用到前面几个utils,比如下载文件的方法,就使用到了Fileutils pac ...
- poj 1321 棋盘问题 简单DFS
题目链接:http://poj.org/problem?id=1321 很久没有敲搜索了啊,今天敲了个水题练练手,哈哈.... 题目大意: 就是求在n*n的方格上放置k个棋子的方案数 代码: #inc ...
- iOS开发之判断用户是否打开APP通知开关
一.前言 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是 ...
- js实用方法记录-js动态加载css、js脚本文件
js实用方法记录-动态加载css/js 附送一个加载iframe,h5打开app代码 1. 动态加载js文件到head标签并执行回调 方法调用:dynamicLoadJs('http://www.yi ...
- 关于JAVA自带MD5的方法
有空再详细解释 import java.security.MessageDigest; public class MD5 { public final static String MD51(Strin ...