在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. windows下使用gethostbyname函数报错无法解析的外部符号

    #include <winsock.h> 使用gethostbyname的函数的时候,会显示无法解析的外部符号. 主要问题是因为没有引用WS2_32的lib库 在include上面引用就行 ...

  2. 集群中使用chronyc同步时间

    在集群之中,有些服务器之间的时间需要同步,但并不是所有机器可以直接连外网,这时可以用Chrony工具解决. 解决方法是将其中一台设为时间服务器,然后其它服务器和这台时间服务器同步即可.具体步骤如下: ...

  3. Android图片变形,ImageView属性的设置。

    <ImageView android:id="@+id/iv" android:layout_width="match_parent" android:l ...

  4. Ubuntu下RabbitMQ安装

    由于RabbitMQ需要erlang语言的支持,在安装RabbitMQ之前需要安装erlang,执行命令: sudo apt-get install erlang-nox 安装RabbitMQ命令: ...

  5. 用Excel建模进行决策树分析

    决策树(Decision Tree)在机器学习中也是比较常见的一种算法,最早的决策树算法是ID3,改善后得到了C4.5算法,进一步改进后形成了我们现在使用的C5.0算法,综合性能大幅提高. 算法核心: ...

  6. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  7. day6--递归函数

    一递归函数 我们老师经常喜欢讲的一句话就是:人理解函数,神理解递归,那么什么是递归函数? 递归函数:在一个函数里面调用函数本身,也就是说这个函数里面出现了和函数一样的名字 例如: def func(n ...

  8. 20165205 2017-2018-2 《Java程序设计》第四周学习总结

    20165205 2017-2018-2 <Java程序设计>第四周学习总结 教材学习内容总结 相关概念: 继承:避免多个类间重复定义共同行为 子类与父类: 父类: 对有着共同特性的多类事 ...

  9. sql server转oracle需要注意的几点

    1.  字符型的字段相加需要用“||”,如果用“+”的话,会报“无效的数字”的错误.   2.  Top 1 类似的脚本需要通过where rownum<=1来实现.   3.  ISNULL函 ...

  10. 正则表达式-使用说明Regular Expression How To (Perl, Python, etc)

    notepad++ wiki about regular expression 正则表达式-使用说明Regular Expression How To (Perl, Python, etc) http ...