获取C#中方法的执行时间及其代码注入

 在优化C#代码或对比某些API的效率时,通常需要测试某个方法的运行时间,可以通过DateTime来统计指定方法的执行时间,也可以使用命名空间System.Diagnostics中封装了高精度计时器QueryPerformanceCounter方法的Stopwatch类来统计指定方法的执行时间:

  1.使用DateTime方法:

复制代码
DateTime dateTime = DateTime.Now;
MyFunc();
Console.WriteLine((DateTime.Now
- dateTime).TotalMilliseconds);
复制代码

  2.使用Stopwatch方式:

复制代码
Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); MyFunc();
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
//本次MyFunc()方法的运行毫秒数
//重置计时器stopwatch.Restart(); //此处可以使用stopwatch.Reset(); stopwatch.Start();组合代替
MyFunc();
stopwatch.Stop(); Console.WriteLine(stopwatch.ElapsedMilliseconds);
//本次MyFunc()方法的运行毫秒数
复制代码

 

  以上两种办法都可以达到获取方法执行时间的目的,但是在需要对整个项目中的方法都进行监测用时时,除了使用性能分析工具,我们还可以通过代码注入的方式给程序集中每一个方法加入计时器;

  通过命名空间System.Reflection.Emit中的类可以动态的创建程序集、类型和成员,通常类库Mono.Cecil可以动态读取并修改已经生成的IL文件,这种在不修改源代码的情况下给程序集动态添加功能的技术称为面向切面编程(AOP);

  这里给出了一个注入使用Stopwatch来检测方法执行时间的代码,这里的Mono.Cecil类库可以通过nuget进行安装:

 

复制代码
using System; using System.IO; using System.Linq; using System.Diagnostics; using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Collections.Generic;
复制代码

 

复制代码
    static void Main(string[] args)     {         for (int i = 0; i < args.Length; i++)         {             FileStream fileStream = new FileStream(args[i], FileMode.Open);             if (fileStream != null)             {                 AssemblyDefinition aD = AssemblyDefinition.ReadAssembly(fileStream);                 ModuleDefinition mD = aD.MainModule;                 Collection<TypeDefinition> typeDefinition = mD.Types;                 foreach (TypeDefinition type in typeDefinition)                 {                     if (type.IsClass)                     {                         
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信