使用dynamic来简化反射提高性能【测试运行1亿次时间对比】
using System; using System.Diagnostics; using System.Reflection; namespace ReflectionVsDynamicDemo { /// <summary> /// https://www.cnblogs.com/LifeDecidesHappiness/p/14810810.html /// 使用dynamic来简化反射提高性能【测试运行1亿次时间对比】 /// LDH @ 2021-10-15 /// </summary> internal class Program { /// <summary> /// 执行次数 /// </summary> private static readonly int _execTimes = 10000 * 10000; private static void Main() { Console.Title = "使用dynamic来简化反射实现,并且提高了性能【测试运行1亿次时间对比】"; UseReflectionCallGetName(); UseDynamicCallGetName(); Console.ForegroundColor = ConsoleColor.DarkGreen; Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); UseReflectionCallAddTime(); UseDynamicCallAddTime(); Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); Console.ReadKey(); } /// <summary> /// 使用反射调用方法用时 /// </summary> private static void UseReflectionCallAddTime() { var sample = new DynamicSample(); var m = sample.GetType().GetMethod("Add"); var watch = new Stopwatch(); watch.Start(); for (var i = 0; i < _execTimes; i++) if (m != null) { var re = (int)m.Invoke(sample, new object[] { 1, 2 }); } watch.Stop(); Console.WriteLine($"使用反射调用方法用时:{watch.ElapsedMilliseconds}ms"); } /// <summary> /// 使用dynamic调用方法用时 /// </summary> private static void UseDynamicCallAddTime() { dynamic sample = new DynamicSample(); var watch = new Stopwatch(); watch.Start(); for (var i = 0; i < _execTimes; i++) { int re = sample.Add(1, 2); } watch.Stop(); Console.WriteLine($"使用dynamic调用方法用时:{watch.ElapsedMilliseconds}ms"); } /// <summary> /// 用dynamic调用GetName()方法 /// </summary> private static void UseDynamicCallGetName() { dynamic myInfo = new Me(); string result = myInfo.GetName(); Console.WriteLine($"dynamic调用GetName()方法:{result}"); } /// <summary> /// 用反射调用GetName()方法 /// </summary> private static void UseReflectionCallGetName() { var a = Assembly.GetExecutingAssembly(); var instance = a.CreateInstance("ReflectionVsDynamicDemo.Me"); if (instance != null) { var type = instance.GetType(); var mi = type.GetMethod("GetName"); if (mi != null) { var result = mi.Invoke(instance, null); Console.WriteLine($"用反射调用GetName()方法:{result}"); } } } } internal class Me { public string Blog { get; set; } public string GetName() { return "LDH"; } } public class DynamicSample { public string Name { get; set; } public int Add(int a, int b) { return a + b; } } }

本文作者:Love In Winter
本文链接:https://www.cnblogs.com/LifeDecidesHappiness/p/14810810.html
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以扫一扫,任意打赏,您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/LifeDecidesHappiness/p/14810810.html
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以扫一扫,任意打赏,您的鼓励是博主的最大动力!

浙公网安备 33010602011771号