在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 Newtonsoft.Json;
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();
//entity.DealWithSensorRecord(74619, 75705);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
MethodOperationInfo.Show(); TimeSpan ts1 = DateTime.Now.Subtract(beforDT1);
Console.WriteLine($"总耗时:{ts1.TotalSeconds.ToString()}秒 或 {ts1.TotalMinutes.ToString("f3")}分");
Console.WriteLine("操作完成!");
Console.ReadLine();
} }
public class Class5_test1
{
public virtual void test1()
{
System.Threading.Thread.Sleep( * );
int num = ;
for (int i = ; i < ; i++)
{
num += ;
}
test1();
test1(, );
test1(, "");
}
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}毫秒\r\n"); var arr = invocation.Arguments; MethodOperationInfo.Add(invocation, ts.TotalMilliseconds);
}
//拦截
public void Intercept(IInvocation invocation)
{
this.PreProceed(invocation);
invocation.Proceed();//调用
this.PostProceed(invocation);
}
} public class MethodOperationInfo
{
public string NameSpaceName { get; set; }
public string ClassName { get; set; }
public string MethodName { get; set; }
public string Parameters { get; set; }
public double TotalMilliseconds { get; set; }
public int Num { get; set; } public static List<MethodOperationInfo> list = new List<MethodOperationInfo>();
public static void Add(IInvocation invocation, double TotalMilliseconds)
{
string Parameters = "";
if ((invocation.Arguments != null) && (invocation.Arguments.Length > ))
{
Parameters = JsonConvert.SerializeObject(invocation.Arguments);
} string MethodName = GetMethodNameHavePara(invocation.Method);
list.Add(new MethodOperationInfo
{
MethodName = MethodName,
Parameters = Parameters,
TotalMilliseconds = TotalMilliseconds,
Num =
});
} 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 = ; 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 = ; i < count; i++)
{
name += " ";
}
return name; }
else
{
string value = "";
for (int i = ; i < count; i++)
{
value += " ";
}
value += name;
return value;
}
} public static void Show()
{
StringBuilder sb = new StringBuilder(); //方法耗时统计
Dictionary<string, MethodOperationInfo> dic = new Dictionary<string, MethodOperationInfo>();
for (int i = ; i < list.Count; i++)
{
Console.WriteLine($"处理数据-当前行:{list.Count - i}");
var item = list[i];
string MethodName = item.MethodName;
double TotalMilliseconds = item.TotalMilliseconds; if (dic.ContainsKey(MethodName))
{
dic[MethodName].TotalMilliseconds += TotalMilliseconds;
dic[MethodName].Num += ;
}
else
{
dic.Add(MethodName, new MethodOperationInfo
{
MethodName = MethodName,
TotalMilliseconds = TotalMilliseconds,
Num =
});
}
} //日志
string str = "";
double Total_Milliseconds = ;
foreach (var item in dic)
{
Total_Milliseconds += item.Value.TotalMilliseconds;
str += $"方法:{GetSameLenString(item.Key, 80)} ";
str += $"次数:{GetSameLenString(item.Value.Num, 10)} ";
str += $"耗时:{GetSameLenString(item.Value.TotalMilliseconds, 10, false) }毫秒 ";
str += $"\r\n";
}
str += "\r\n";
str += "\r\n";
str += $"总耗时:{Total_Milliseconds}毫秒 ";
str += $"{Total_Milliseconds / 1000}秒 ";
str += $"{(Total_Milliseconds / 1000 / 60).ToString("f2")}分钟 ";
str += $"当前时间:{DateTime.Now} ";
str += "\r\n";
str += "\r\n";
str += "\r\n";
sb.Append(str); //每个方法 每次的 单独耗时
for (int i = ; i < list.Count; i++)
{
Console.WriteLine($"处理数据-当前行:{list.Count - i}");
var item = list[i];
sb.Append($"方法:{GetSameLenString(item.MethodName, 80)} ");
sb.Append($"次数:{GetSameLenString(item.Num, 10)} ");
sb.Append($"耗时:{GetSameLenString(item.TotalMilliseconds, 10, false) }毫秒 ");
sb.Append($"参数:{GetSameLenString(item.Parameters, 50)} ");
sb.Append($"\r\n");
} System.IO.File.WriteAllText("1.txt", sb.ToString());
Console.WriteLine("完成!");
} public static void Show2()
{
StringBuilder sb = new StringBuilder();
Dictionary<string, MethodOperationInfo> dic = new Dictionary<string, MethodOperationInfo>(); for (int i = ; i < list.Count; i++)
{
Console.WriteLine($"处理数据-当前行:{list.Count - i}");
var item = list[i]; //每个方法每次的耗时
sb.Append($"方法:{GetSameLenString(item.MethodName, 80)} ");
sb.Append($"次数:{GetSameLenString(item.Num, 10)} ");
sb.Append($"耗时:{GetSameLenString(item.TotalMilliseconds, 10, false) }毫秒 ");
sb.Append($"参数:{GetSameLenString(item.Parameters, 50)} ");
sb.Append($"\r\n"); //每个方法的总耗时
string MethodName = item.MethodName;
double TotalMilliseconds = item.TotalMilliseconds;
if (dic.ContainsKey(MethodName))
{
dic[MethodName].TotalMilliseconds += TotalMilliseconds;
dic[MethodName].Num += ;
}
else
{
dic.Add(MethodName, new MethodOperationInfo
{
MethodName = MethodName,
TotalMilliseconds = TotalMilliseconds,
Num =
});
}
} //日志
string str = "";
double Total_Milliseconds = ;
str += "《每个方法的总耗时》\r\n";
foreach (var item in dic)
{
Total_Milliseconds += item.Value.TotalMilliseconds;
str += $"方法:{GetSameLenString(item.Key, 80)} ";
str += $"次数:{GetSameLenString(item.Value.Num, 10)} ";
str += $"耗时:{GetSameLenString(item.Value.TotalMilliseconds, 10, false) }毫秒 ";
str += $"\r\n";
}
str += "\r\n";
str += $"《总耗时》:{Total_Milliseconds}毫秒 ";
str += $"{Total_Milliseconds / 1000}秒 ";
str += $"{(Total_Milliseconds / 1000 / 60).ToString("f2")}分钟 ";
str += $"当前时间:{DateTime.Now} ";
str += "\r\n\r\n"; str += "《每个方法每次的耗时》\r\n";
sb.Insert(, str); System.IO.File.WriteAllText("1.txt", sb.ToString());
Console.WriteLine("完成!");
}
} #region old //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 void Add(IInvocation invocation, double TotalMilliseconds)
// {
// string MethodName = GetMethodNameHavePara(invocation.Method);
// 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 += $"\r\n";
// } // str += "\r\n";
// str += "\r\n";
// str += $"总耗时:{TotalMilliseconds}毫秒 ";
// str += $"{TotalMilliseconds / 1000}秒 ";
// str += $"{(TotalMilliseconds / 1000 / 60).ToString("f2")}分钟 ";
// str += $"当前时间:{DateTime.Now} ";
// str += "\r\n"; // System.IO.File.WriteAllText("1.txt", str); // Console.WriteLine("--------------------------\r\n\r\n");
// Console.WriteLine(str);
// } //}
#endregion
}

截图1:

截图2:

C# 监测每个方法的执行次数和占用时间(测试2)的更多相关文章

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

    原文:http://www.cnblogs.com/RicCC/archive/2010/03/15/castle-dynamic-proxy.html 在Nuget引用 Castle.Dynamic ...

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

    今天也要做这个功能,就百度一下,结果搜索到了自己的文章.一开始还没注意,当看到里面的一个注释的方法时,一开始还以为自己复制错了代码,结果仔细一看网页的文章,我去,原来是自己写的,写的确实不咋地. 把自 ...

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

    在Nuget引用 Castle.DynamicProxy 和 Newtonsoft.Json 这个 原文:http://www.cnblogs.com/RicCC/archive/2010/03/15 ...

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

    又找到了一个bug 测试的类: public class Class11_1 { public virtual List<int> test2_1(List<tb_SensorRec ...

  5. 事件之onTouch方法的执行过程 及和 onClick执行发生冲突的解决办法

    转载:http://blog.csdn.net/jiangwei0910410003/article/details/17504315#quote 博主推荐: 风萧兮兮易水寒,“天真”一去兮不复还.如 ...

  6. Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法

    $*********************************************************************************************$ 博主推荐 ...

  7. ORACLE查看SQL的执行次数/频率

    在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频繁的S ...

  8. PLSQL_查询SQL的执行次数和频率(案例)

    2014-12-25 Created By BaoXinjian

  9. PLSQL_监控有些SQL的执行次数和频率

    原文:PLSQL_监控有些SQL的执行次数和频率 2014-12-25 Created By 鲍新建

随机推荐

  1. HBase核心知识和应用案例

    Hbase 热点问题? Hbase 预分区 Hbase Rowkey 设计原则 Hbase 常见避免热点问题方法 Hbase 总结 Hbase 连续查询的Rowkey设计 Hbase 随机查询的Row ...

  2. Javascript的闭包及其使用技巧实例

    Javascript的闭包及其使用技巧实例 一.闭包的基本概念 闭包(Closure)是一个引用了自由变量的函数,记录了该函数在定义时的scope chain.又称词法闭包(Lexical Closu ...

  3. angularjs中ng-repeat插入图片

    <tr ng-repeat="item in datas" ng-module="datas"> <td> <img class ...

  4. 【Selenium-WebDriver自学】Selenium TestNG(十四)

    ==================================================================================================== ...

  5. 5种分布式共享session的方法

    集群/分布式环境下5种session处理策略 转载 2016年03月16日 08:59:53 标签: session / nginx / 分布式 / 集群 11098 转载自:http://blog. ...

  6. JAVA面试精选【Java基础第二部分】

    上一篇,我们给出了大概35个题目,都是基础知识,有童鞋反映题目过时了,其实不然,这些是基础中的基础,但是也是必不可少的,面试题目中还是有一些基础题目的,我们本着先易后难的原则,逐渐给出不同级别的题目, ...

  7. [UGUI]渲染层级关系

    参考链接: http://blog.csdn.net/meegomeego/article/details/42060389 Unity中的渲染顺序自上而下大致可以分为三层: 1.Camera层.可以 ...

  8. ORACLE ROWNUM解析[转]

    一.对rownum的说明 关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中的“>.>=.=.between...and”运算符,只能用如下运算符号“<.< ...

  9. [转]asp+oracle分页

    PageSize:每页显示的记录数.PageCount:根据用户设定好的PageSize和表中的总记录数,系统自动算出总页数.RecordCount:表中的总记录数.AbsolutePage:表示当前 ...

  10. redis下操作Set和Zset

    redis操作set 无序集合 元素为string类型 元素具有唯一性,不重复 命令 设置 添加元素 SADD key member [member ...]  获取 返回key集合所有的元素 SME ...