博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写高质量代码改善程序的157个建议:使用Dynamic来简化反射的实现
阅读量:6893 次
发布时间:2019-06-27

本文共 2757 字,大约阅读时间需要 9 分钟。

   最近有时间看点书了,把157个建议在重新看一遍,代码都调试一遍。当我看到第15个建议的时候有些出入,就记录下来,欢迎大家来探讨。

   第十五条建议是,使用dynamic简化反射的使用,如果是针对这句话来讲,没问题,是正确的。dynamic的确可以简化反射的使用,但是从性能上来说是有条件的,可以根据自己情况选择。

   我按着书上的代码,原封不动的敲了一遍,如下

1 class Program 2     { 3         static void Main(string[] args) 4         { 5             int times = 1; 6             DynamicSample dynamicSample = new DynamicSample(); 7             var addMethod = typeof(DynamicSample).GetMethod("Add"); 8  9             Stopwatch watch1 = Stopwatch.StartNew();10             int result = 0;11             for (int i = 0; i < times; i++)12             {13                 result = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });14             }15             Console.WriteLine(string.Format("正常的反射耗时:{0}毫秒", watch1.ElapsedMilliseconds));16 17             Console.WriteLine("正常反射的结果:"+result);18 19             dynamic dynamicSample2 = new DynamicSample();20             int result2 = 0;21             Stopwatch watch2 = Stopwatch.StartNew();22             for (int i = 0; i < times; i++)23             {24                 result2 = dynamicSample2.Add(1, 2);25             }26             Console.WriteLine(string.Format("Dynamic的反射耗时:{0}毫秒", watch2.ElapsedMilliseconds));27 28             Console.WriteLine("Dynamic反射的结果:"+result2);29 30             DynamicSample reflectSamplebetter = new DynamicSample();31             var addMethod2 = typeof(DynamicSample).GetMethod("Add");32             var delg = (Func
)Delegate.CreateDelegate(typeof(Func
), addMethod2);33 int result3 = 0;34 Stopwatch watch3 = Stopwatch.StartNew();35 for (int i = 0; i < times; i++)36 {37 result3=delg(reflectSamplebetter,1,2);38 }39 Console.WriteLine(string.Format("优化的反射耗时:{0}毫秒", watch3.ElapsedMilliseconds));40 41 Console.WriteLine("优化的反射结果:"+result3);42 Console.Read();43 }44 }

对了,还有我们的测试实体类:

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是真的可以简化反射使用,对性能是分条件的。

转载于:https://www.cnblogs.com/PatrickLiu/p/7016342.html

你可能感兴趣的文章
vs2017莫名自动退出调试状态可以尝试一下如下的方法
查看>>
教你搞定ElasticSearch(head)
查看>>
Mac解压缩速度贼慢?那你一定要看看这个!
查看>>
使用PHP+Sphinx建立高效的站内搜索引擎
查看>>
Fastjson中以is打头出现的问题,会生成两个变量
查看>>
HTTP API网关选择之一Kong介绍
查看>>
基于Redis构建10万+终端级的高性能部标JT808协议的Gps网关服务器(转)
查看>>
把搜狗输入法词库导入Google拼音输入法
查看>>
利用反射将IDataReader读取到实体类中效率低下的解决办法
查看>>
用ndp部署storm应用
查看>>
【Java】监控远程服务器JVM
查看>>
JVM系列第12讲:JVM参数之查看JVM参数
查看>>
Spring中加载xml配置文件的六种方式
查看>>
android Fragments详解二:创建Fragment
查看>>
知道创宇 - 中文版putty后门事件分析
查看>>
电子政务信息交换平台与数据中心的构建(转)
查看>>
妄撮小游戏的开发思想-Android开发资料-《妄撮(撕开美女衣服)》游戏源代码外传...
查看>>
用ethtool确定多网卡Linux服务器网口位置
查看>>
Perl分割字符串的一个精妙的写法
查看>>
零点祝福
查看>>