ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用dynamic来简化反射提高性能【测试运行1亿次时间对比】

2021-10-15 17:31:07  阅读:174  来源: 互联网

标签:测试运行 Console watch GetName dynamic static var 亿次


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;
        }
    }
}

 

标签:测试运行,Console,watch,GetName,dynamic,static,var,亿次
来源: https://www.cnblogs.com/LifeDecidesHappiness/p/14810810.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有