经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
获取C#中方法的执行时间及其代码注入
来源:cnblogs  作者:Minotauros  时间:2018/11/9 11:24:19  对本文有异议

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

  1.使用DateTime方法:

  1. DateTime dateTime =- dateTime).TotalMilliseconds);

  2.使用Stopwatch方式:

  1. Stopwatch stopwatch = stopwatch.Restart();

 

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

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

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

 

  1. using System;using System.IO;using System.Linq;using System.Diagnostics;using Mono.Cecil;using Mono.Cecil.Cil;using Mono.Collections.Generic;

 

  1.       Main( ( i = ; i < args.Length; i++=  (fileStream != ==<TypeDefinition> typeDefinition = (TypeDefinition type  (MethodDefinition method  (method.IsPublic && !== mD.ImportReference(= =(Stopwatch).GetConstructor((Stopwatch).GetMethod(=(Stopwatch).GetMethod((Stopwatch).GetMethod((().GetMethod(,  Type[] { (), ((Console).GetMethod(,  Type[] { (=  fileName = pointIndex = fileName.LastIndexOf( frontName = fileName.Substring( backName = fileName.Substring(pointIndex, fileName.Length - writeFilePath = Path.Combine(fileInfo.Directory.FullName, frontName +  +

 

  完整的项目传到了Github上=>InjectionStopwatchCode,下载项目后,通过dotnet build命令即可编译出可执行程序,将目标程序集文件拖入到该应用程序即可在程序集目录导出注入代码后的程序集文件,经过测试,包括方法拥有返回值和方法的参数列表中包含out和ref参数等情况都不会对运行结果产生影响;

  示例:

  1. using System;public class MyClass
  2. {public void MyFunc()
  3.     {int num = 1;for (int i = 0; i < int.MaxValue; i++)
  4.         {
  5.             num++;
  6.         }
  7.     }
  8. }public class Program
  9. {public static void Main(string[] args)
  10.     {
  11.         MyClass myObj = new MyClass();
  12.         myObj.MyFunc();
  13.         Console.Read();
  14.     }
  15. }

  原始IL代码:

  代码注入后IL代码:

  代码注入后运行结果:

 

 


 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号