C# 监测每个方法的执行次数和占用时间(测试1)

 在Nuget引用 Castle.DynamicProxy 和 Newtonsoft.Json 这个

 原文:http://www.cnblogs.com/RicCC/archive/2010/03/15/castle-dynamic-proxy.html

代码:

using Castle.Core.Interceptor;
using Castle.DynamicProxy;
using ConsoleApplication1.test;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace ConsoleApplication2.AOP
{
    class Class5
    {
        static void Main(string[] args)
        {
            ProxyGenerator generator = new ProxyGenerator();//代理
            CallingLogInterceptor interceptor = new CallingLogInterceptor();//定义 拦截器
            Class5_test1 entity = generator.CreateClassProxy<Class5_test1>(interceptor);
            //SensorRecordService entity = generator.CreateClassProxy<SensorRecordService>(interceptor);


            DateTime beforDT1 = DateTime.Now;//开始时间            
            try
            {
                entity.test1();
                //Console.WriteLine(entity.DealWithSensorRecord(74619, 87619).Replace("<br>", "
"));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


            TimeSpan ts1 = DateTime.Now.Subtract(beforDT1);
            Console.WriteLine($"总耗时:{ts1.TotalSeconds.ToString()}秒  或  {ts1.TotalMinutes.ToString("f3")}分");

            MethodOperationInfo.Show();

            Console.WriteLine("操作完成!");
            Console.ReadLine();            
        }
        
    }
    public class Class5_test1
    {
        public virtual void test1()
        {
            System.Threading.Thread.Sleep(1000 * 1);
            int num = 0;
            for (int i = 0; i < 10000; i++)
            {
                num += 1;
            }
            test1(1);
            test1(1, 2);
            test1(1, "");
        }
        public virtual void test1(int i)
        {
        }
        public virtual void test1(int i, int j)
        {
        }
        public virtual void test1(int i, string j)
        {
        }
    }

    //拦截器
    public class CallingLogInterceptor : IInterceptor
    {
        private DateTime dt { get; set; }
        private TimeSpan ts { get; set; }

        //方法执行前
        private void PreProceed(IInvocation invocation)
        {
            dt = DateTime.Now;
        }
        //方法执行后
        private void PostProceed(IInvocation invocation)
        {
            ts = DateTime.Now - dt;
            //Console.Write($"类名:{invocation.TargetType} 方法名:{invocation.Method.Name} 耗时:{ts.TotalMilliseconds}毫秒
");
            MethodOperationInfo.Add(invocation.Method, ts.TotalMilliseconds);
        }
        //拦截
        public void Intercept(IInvocation invocation)
        {
            this.PreProceed(invocation);
            invocation.Proceed();//调用
            this.PostProceed(invocation);
        }
    }


    public class MethodOperationInfo
    {
        public string ClassName { get; set; }
        public string MethodName { get; set; }
        public double TotalMilliseconds { get; set; }
        public int Num { get; set; }



        public static Dictionary<string, MethodOperationInfo> dic = new Dictionary<string, MethodOperationInfo>();
        public static void Add(string MethodName, double TotalMilliseconds)
        {
            if (dic.ContainsKey(MethodName))
            {
                dic[MethodName].TotalMilliseconds += TotalMilliseconds;
                dic[MethodName].Num += 1;
            }
            else
            {
                dic.Add(MethodName, new MethodOperationInfo
                {
                    MethodName = MethodName,
                    TotalMilliseconds = TotalMilliseconds,
                    Num = 1
                });
            }
        }
        public static void Add(MethodInfo mInfo, double TotalMilliseconds)
        {
            string MethodName = GetMethodNameHavePara(mInfo);
            if (dic.ContainsKey(MethodName))
            {
                dic[MethodName].TotalMilliseconds += TotalMilliseconds;
                dic[MethodName].Num += 1;
            }
            else
            {
                dic.Add(MethodName, new MethodOperationInfo
                {
                    MethodName = MethodName,
                    TotalMilliseconds = TotalMilliseconds,
                    Num = 1
                });
            }
        }


        public static string GetMethodNameHavePara(MethodInfo mInfo)
        {
            string str = "";
            //str += GetSameLenString(mInfo.ReflectedType.FullName, 50);//类名(含命名空间)

            var pInfos = mInfo.GetParameters();
            str += mInfo.Name;
            str += "(";
            for (int j = 0; j < pInfos.Length; j++)
            {
                var p = pInfos[j];
                string pTypeName = $"{p.ParameterType.ToString()}, ";
                if (p.ParameterType.IsGenericType && (p.ParameterType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                {
                    pTypeName = $"{Nullable.GetUnderlyingType(p.ParameterType).Name}?, ";
                }
                str += pTypeName;
            }
            str = str.TrimEnd(' ').TrimEnd(',');
            str += ")";

            return str;
        }
        public static string GetSameLenString(object obj, int len, bool afterFill = true)
        {
            string name = obj.ToString();
            int count = len - name.Length;

            if (afterFill)
            {
                for (int i = 0; i < count; i++)
                {
                    name += " ";
                }
                return name;

            }
            else
            {
                string value = "";
                for (int i = 0; i < count; i++)
                {
                    value += " ";
                }
                value += name;
                return value;
            }
        }


        public static void Show()
        {
            string str = "";
            double TotalMilliseconds = 0;

            foreach (var item in dic)
            {
                TotalMilliseconds += item.Value.TotalMilliseconds;
                str += $"方法:{GetSameLenString(item.Key, 80)}     ";
                str += $"次数:{GetSameLenString(item.Value.Num, 10)}     ";
                str += $"耗时:{GetSameLenString(item.Value.TotalMilliseconds, 10, false) }毫秒     ";
                str += $"
";
            }

            str += "
";
            str += "
";
            str += $"总耗时:{TotalMilliseconds}毫秒    ";
            str += $"{TotalMilliseconds / 1000}秒    ";
            str += $"{(TotalMilliseconds / 1000 / 60).ToString("f2")}分钟    ";
            str += $"当前时间:{DateTime.Now}    ";
            str += "
";

            System.IO.File.WriteAllText("1.txt", str);

            Console.WriteLine("--------------------------

");
            Console.WriteLine(str);
        }
        
    }
}
View Code

效果:

原文地址:https://www.cnblogs.com/guxingy/p/10131459.html