C# 监测每个方法的执行次数和占用时间(测试2)
在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)的更多相关文章
- C# 监测每个方法的执行次数和占用时间(测试3)
原文:http://www.cnblogs.com/RicCC/archive/2010/03/15/castle-dynamic-proxy.html 在Nuget引用 Castle.Dynamic ...
- C# 监测每个方法的执行次数和占用时间(测试4)
今天也要做这个功能,就百度一下,结果搜索到了自己的文章.一开始还没注意,当看到里面的一个注释的方法时,一开始还以为自己复制错了代码,结果仔细一看网页的文章,我去,原来是自己写的,写的确实不咋地. 把自 ...
- C# 监测每个方法的执行次数和占用时间(测试1)
在Nuget引用 Castle.DynamicProxy 和 Newtonsoft.Json 这个 原文:http://www.cnblogs.com/RicCC/archive/2010/03/15 ...
- C# 监测每个方法的执行次数和占用时间(测试5)
又找到了一个bug 测试的类: public class Class11_1 { public virtual List<int> test2_1(List<tb_SensorRec ...
- 事件之onTouch方法的执行过程 及和 onClick执行发生冲突的解决办法
转载:http://blog.csdn.net/jiangwei0910410003/article/details/17504315#quote 博主推荐: 风萧兮兮易水寒,“天真”一去兮不复还.如 ...
- Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法
$*********************************************************************************************$ 博主推荐 ...
- ORACLE查看SQL的执行次数/频率
在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频繁的S ...
- PLSQL_查询SQL的执行次数和频率(案例)
2014-12-25 Created By BaoXinjian
- PLSQL_监控有些SQL的执行次数和频率
原文:PLSQL_监控有些SQL的执行次数和频率 2014-12-25 Created By 鲍新建
随机推荐
- spark2.3.0 配置spark sql 操作hive
spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然后在spark引擎中进行sql统计分析,从而,通过spark sql与hive结合实现数据分析将成为一种最佳实践.配置步骤 ...
- ElasticSearch索引
简介 索引是具有相同结构的文档集合.在Elasticsearch中索引是个非常重要的内容,对Elasticsearch的大部分操作都是基于索引来完成的.同时索引可以类比关系型数据库Mysql中的数据库 ...
- vs2015 引用lib库和dll
1.首先右键项目->属性 2.在项目中添加lib文件夹,把lib库放在文件夹下面,然后在图中的库目录引用当前路径的lib文件夹 3.在项目的路径下添加include中添加头文件,然后在常规中添加 ...
- 三种常见的Web安全问题
XSS漏洞 1.XSS简介 跨站脚本(cross site script)简称为XSS,是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式. XSS是指恶意攻击者利用网站没有对 ...
- 制作本地yum源
镜像源是centos当中下载相关软件的地址,我们可以通过制作我们自己的镜像源指定我们去哪里下载impala的rpm包,这里我们使用httpd这个软件来作为服务端,启动httpd的服务来作为我们镜像源的 ...
- ROS Industrial 简介
ROS_I means ROS Industrial ROS_I 解决了哪些问题: 1. 让自动化可以互相协作,操纵器.末端执行器.感知系统/传感器,移动平台,周边设备,都可只用一种语言(ROS me ...
- scala函数和方法的差别
想知道什么差别,把代码复制下来运行看结果 // 1 1 2 3 5 8 13 def f(x:Int) :Int= { ) ) else f(x-)+f(x-) } println(f()) // v ...
- 搭建eclipse开发环境
eclipse-jee配置 基本配置: 快捷查找:window->perferences->搜索框搜索 utf8: window->perferences->general-& ...
- elk之[logstash-input-file]插件使用详解
https://www.cnblogs.com/xing901022/p/4805586.html http://www.cnblogs.com/xing901022/p/4802822.html ...
- ndoejs处理编码的爬虫
var express=require('express');var http=require('http');var cheerio=require('cheerio');var fs=requir ...