• 使用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;
            }
        }
    }

     

    踏实做一个为人民服务的搬运工!
  • 相关阅读:
    网络设备snmp配置syslog方法。
    Oracle19c安装手册Windows及mysql-oracle转换
    Oracle11g--hxss安装
    VMWare ESXI 6.5 的部署及简单使用的说明
    windos下redis的启动与安装
    二、fidder 和 python结合进行 get post 请求发送
    一、fidder工具使用
    Python学习二《数据类型介绍》
    Python学习一《基础规范》
    Charles设置为代理服务
  • 原文地址:https://www.cnblogs.com/LifeDecidesHappiness/p/14810810.html
Copyright © 2020-2023  润新知