亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

如何獲取C#中方法的執行時間以及其代碼注入詳解

2019-10-29 19:57:59
字體:
來源:轉載
供稿:網友

前言

在優化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)  {  foreach (MethodDefinition method in type.Methods)  {  if (method.IsPublic && !method.IsConstructor)  {  ILProcessor il = method.Body.GetILProcessor();  TypeReference stT = mD.ImportReference(typeof(Stopwatch));  VariableDefinition stV = new VariableDefinition(stT);  method.Body.Variables.Add(stV);  Instruction first = method.Body.Instructions.First();  il.InsertBefore(first, il.Create(OpCodes.Newobj,                       mD.ImportReference(typeof(Stopwatch).GetConstructor(new Type[] { }))));  il.InsertBefore(first, il.Create(OpCodes.Stloc_S, stV));  il.InsertBefore(first, il.Create(OpCodes.Ldloc_S, stV));  il.InsertBefore(first, il.Create(OpCodes.Callvirt,                      mD.ImportReference(typeof(Stopwatch).GetMethod("Start"))));  Instruction @return = method.Body.Instructions.Last();  il.InsertBefore(@return, il.Create(OpCodes.Ldloc_S, stV));  il.InsertBefore(@return, il.Create(OpCodes.Callvirt,                       mD.ImportReference(typeof(Stopwatch).GetMethod("Stop"))));  il.InsertBefore(@return, il.Create(OpCodes.Ldstr, $"{method.FullName} run time: "));  il.InsertBefore(@return, il.Create(OpCodes.Ldloc_S, stV));  il.InsertBefore(@return, il.Create(OpCodes.Callvirt,                       mD.ImportReference(typeof(Stopwatch).GetMethod("get_ElapsedMilliseconds"))));  il.InsertBefore(@return, il.Create(OpCodes.Box, mD.ImportReference(typeof(long))));  il.InsertBefore(@return, il.Create(OpCodes.Call,                       mD.ImportReference(typeof(string).GetMethod("Concat", new Type[] { typeof(object), typeof(object) }))));  il.InsertBefore(@return, il.Create(OpCodes.Call,                       mD.ImportReference(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }))));  }  }  } } FileInfo fileInfo = new FileInfo(args[i]); string fileName = fileInfo.Name; int pointIndex = fileName.LastIndexOf('.'); string frontName = fileName.Substring(0, pointIndex); string backName = fileName.Substring(pointIndex, fileName.Length - pointIndex); string writeFilePath = Path.Combine(fileInfo.Directory.FullName, frontName + "_inject" + backName); aD.Write(writeFilePath); Console.WriteLine($"Success! Output path: {writeFilePath}"); fileStream.Dispose(); } } Console.Read(); }

完整的項目傳到了Github上=>InjectionStopwatchCode,下載項目后,通過dotnet build命令即可編譯出可執行程序,將目標程序集文件拖入到該應用程序即可在程序集目錄導出注入代碼后的程序集文件,經過測試,包括方法擁有返回值和方法的參數列表中包含out和ref參數等情況都不會對運行結果產生影響;

示例:

using System;public class MyClass{ public void MyFunc() { int num = 1; for (int i = 0; i < int.MaxValue; i++) { num++; } }}public class Program{ public static void Main(string[] args) { MyClass myObj = new MyClass(); myObj.MyFunc(); Console.Read(); }}

原始IL代碼:

C#,執行時間,代碼注入

代碼注入后IL代碼:

C#,執行時間,代碼注入

代碼注入后運行結果:

 C#,執行時間,代碼注入

 總結:

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019中文字幕在线高清| 韩剧1988在线观看免费完整版| 国产一区二区三区毛片| 亚洲色在线视频| 亚洲一区二区福利| 91精品视频网站| 日韩免费不卡av| 久久亚洲精品国产亚洲老地址| 亚洲色在线视频| 国产日韩在线精品av| 国产午夜精品视频| 日韩欧美高清视频| 国产精品99蜜臀久久不卡二区| 成人午夜两性视频| 97精品国产97久久久久久| 高清欧美性猛交xxxx黑人猛交| 亚洲国产成人久久综合一区| 97av在线视频免费播放| 亚洲娇小xxxx欧美娇小| 欧美成人自拍视频| 欧美日韩在线观看视频小说| 欧美日韩免费在线观看| 成人免费自拍视频| 日韩亚洲综合在线| 亚洲大胆人体av| 欧美孕妇毛茸茸xxxx| 欧美黄色片视频| 成人字幕网zmw| 国产精品成熟老女人| 91久久精品视频| 成人国内精品久久久久一区| 亚洲第一网站男人都懂| 亚洲天堂开心观看| 国产精品国产三级国产aⅴ浪潮| 日韩毛片在线观看| 大荫蒂欧美视频另类xxxx| 日本91av在线播放| 日韩欧美黄色动漫| 日韩不卡在线观看| 亚洲国产97在线精品一区| 久久全国免费视频| 2019国产精品自在线拍国产不卡| 欧美日韩不卡合集视频| 亚洲视频一区二区| 亚洲片在线资源| 欧美一区亚洲一区| 国产精品视频中文字幕91| 日韩欧美国产中文字幕| 日韩激情av在线播放| 欧美xxxx综合视频| 亚洲电影免费观看高清完整版| 亚洲自拍偷拍视频| 亚洲精品日韩激情在线电影| 久久久精品久久久久| 日韩在线观看免费av| 亚洲国产精品yw在线观看| 日韩的一区二区| 亚洲精品v欧美精品v日韩精品| 538国产精品一区二区在线| 色综合久久88| 亚洲免费中文字幕| 国产精品热视频| 国产91网红主播在线观看| 在线观看日韩专区| 欧美亚洲视频在线看网址| 精品国产91久久久久久老师| 成人做爽爽免费视频| 国产在线观看不卡| 高清一区二区三区日本久| 欧美极品少妇xxxxⅹ免费视频| 91精品国产高清久久久久久91| 日韩在线精品一区| 亚洲奶大毛多的老太婆| 欧美精品少妇videofree| 久久亚洲一区二区三区四区五区高| 国产香蕉一区二区三区在线视频| 国产精品久久久久久久午夜| 亚洲偷熟乱区亚洲香蕉av| 这里只有精品在线播放| 日韩免费不卡av| 久久久日本电影| 日本欧美国产在线| 亚洲一级片在线看| 日韩成人av网| 国产精品一区二区三区在线播放| 欧美男插女视频| 不卡毛片在线看| 欧美一二三视频| 精品视频在线播放免| 亚洲天堂免费观看| 日韩精品www| 欧美成人激情视频| 一本久久综合亚洲鲁鲁| 奇米影视亚洲狠狠色| 日本高清视频一区| 夜色77av精品影院| 在线观看欧美www| 97在线精品国自产拍中文| 久久精品国产一区| 日本乱人伦a精品| 亚洲美女又黄又爽在线观看| 欧美最顶级的aⅴ艳星| 亚洲女人天堂色在线7777| 欧美韩国理论所午夜片917电影| 精品香蕉在线观看视频一| 中文字幕精品在线视频| 国产成人一区二区三区| 亚洲激情成人网| 欧美老少配视频| 欧美性色19p| 蜜臀久久99精品久久久无需会员| 91精品国产91久久久久久久久| 中文字幕亚洲图片| 亚洲性av在线| 精品久久久香蕉免费精品视频| 久久久久久这里只有精品| 亚洲男人天堂网| 久久久av亚洲男天堂| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品久久在线观看| 久久综合国产精品台湾中文娱乐网| 日本精品视频在线观看| 大胆人体色综合| 激情成人中文字幕| 日韩av在线看| 亚洲无线码在线一区观看| 亚洲一区二区中文| 成人欧美一区二区三区在线| 久久久久北条麻妃免费看| 国产精品老女人精品视频| 国产精品精品久久久久久| 欧美性猛交xxx| 亚洲国产精品中文| 国产精品视频精品| 国产精品免费视频xxxx| 亚洲精品视频中文字幕| 国产精品美女午夜av| 亚洲精品在线观看www| 精品国产91久久久久久| 欧美精品久久久久久久免费观看| 久久影视三级福利片| 青青a在线精品免费观看| 精品视频久久久久久久| 2019中文字幕在线免费观看| 久久久久久久电影一区| 国产精品成人一区| 亚洲欧洲在线免费| 国产精品爱啪在线线免费观看| 黄色精品在线看| 国产精品尤物福利片在线观看| 国产视频福利一区| 久久久久国色av免费观看性色| 日韩激情在线视频| 亚洲综合中文字幕68页| 亚洲无限乱码一二三四麻| 国产精品永久免费观看| 亚洲欧美制服丝袜| 日韩中文在线中文网三级| 啪一啪鲁一鲁2019在线视频| 中文字幕欧美专区| 国产精品视频永久免费播放| 色七七影院综合| 自拍亚洲一区欧美另类| 色爱av美腿丝袜综合粉嫩av|