激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - C# - 如何獲取C#中方法的執(zhí)行時(shí)間以及其代碼注入詳解

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

2022-03-05 17:09Minotauros C#

這篇文章主要給大家介紹了關(guān)于如何獲取C#中方法的執(zhí)行時(shí)間以及其代碼注入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧

前言

在優(yōu)化c#代碼或?qū)Ρ饶承゛pi的效率時(shí),通常需要測(cè)試某個(gè)方法的運(yùn)行時(shí)間,可以通過(guò)datetime來(lái)統(tǒng)計(jì)指定方法的執(zhí)行時(shí)間,也可以使用命名空間system.diagnostics中封裝了高精度計(jì)時(shí)器queryperformancecounter方法的stopwatch類來(lái)統(tǒng)計(jì)指定方法的執(zhí)行時(shí)間:

1.使用datetime方法:

?
1
2
3
4
5
datetime datetime = datetime.now;
 
myfunc();
 
console.writeline((datetime.now - datetime).totalmilliseconds);

2.使用stopwatch方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stopwatch stopwatch = new stopwatch();
stopwatch.start();
myfunc();
 
stopwatch.stop();
 
console.writeline(stopwatch.elapsedmilliseconds); //本次myfunc()方法的運(yùn)行毫秒數(shù)
 
//重置計(jì)時(shí)器
stopwatch.restart(); //此處可以使用stopwatch.reset(); stopwatch.start();組合代替
 
myfunc();
 
stopwatch.stop();
console.writeline(stopwatch.elapsedmilliseconds); //本次myfunc()方法的運(yùn)行毫秒數(shù)

以上兩種辦法都可以達(dá)到獲取方法執(zhí)行時(shí)間的目的,但是在需要對(duì)整個(gè)項(xiàng)目中的方法都進(jìn)行監(jiān)測(cè)用時(shí)時(shí),除了使用性能分析工具,我們還可以通過(guò)代碼注入的方式給程序集中每一個(gè)方法加入計(jì)時(shí)器;

通過(guò)命名空間system.reflection.emit中的類可以動(dòng)態(tài)的創(chuàng)建程序集、類型和成員,通常類庫(kù)mono.cecil可以動(dòng)態(tài)讀取并修改已經(jīng)生成的il文件,這種在不修改源代碼的情況下給程序集動(dòng)態(tài)添加功能的技術(shù)稱為面向切面編程(aop);

這里給出了一個(gè)注入使用stopwatch來(lái)檢測(cè)方法執(zhí)行時(shí)間的代碼,這里的mono.cecil類庫(kù)可以通過(guò)nuget進(jìn)行安裝:

?
1
2
3
4
5
6
7
using system;
using system.io;
using system.linq;
using system.diagnostics;
using mono.cecil;
using mono.cecil.cil;
using mono.collections.generic;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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();
 }

完整的項(xiàng)目傳到了github上=>injectionstopwatchcode,下載項(xiàng)目后,通過(guò)dotnet build命令即可編譯出可執(zhí)行程序,將目標(biāo)程序集文件拖入到該應(yīng)用程序即可在程序集目錄導(dǎo)出注入代碼后的程序集文件,經(jīng)過(guò)測(cè)試,包括方法擁有返回值和方法的參數(shù)列表中包含out和ref參數(shù)等情況都不會(huì)對(duì)運(yùn)行結(jié)果產(chǎn)生影響;

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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#中方法的執(zhí)行時(shí)間以及其代碼注入詳解

代碼注入后il代碼:

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

代碼注入后運(yùn)行結(jié)果:

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

 總結(jié):

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:https://www.cnblogs.com/minotauros/p/9930163.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产欧美成人精品第二区 | 久久免费视频3 | 空姐一级毛片 | 羞羞草视频 | 国产九色在线观看 | av7777777 | 成人一级在线 | 欧美人成在线 | 毛片免费观看完整版 | 精品无吗乱吗av国产爱色 | 国产剧情在线观看一区二区 | 精品久久久久久久久久久久包黑料 | 国产日韩在线观看一区 | 九九热在线免费观看视频 | av黄色片网站 | freexxxx性女hd性吃奶 | 久草中文网 | 91在线播放国产 | 色多多视频导航 | 久久久久久久久久91 | 国产一级在线免费观看 | 精品一区二区三区免费爱 | 国产一级免费在线视频 | 91在线色视频 | av黄色片网站 | 欧美色爱综合 | av在线在线 | 亚洲电影免费观看国语版 | 美国一级毛片片aa久久综合 | 精品国产一区二区久久 | 欧美成人午夜影院 | 中文字幕在线视频日本 | 日本网站在线播放 | 欧美在线观看视频网站 | 免费观看高清视频网站 | 色偷偷欧美 | 成人免费毛片在线观看 | 一级裸体视频 | 国产精品视频在线观看免费 | 古装三级在线观看 | 精品国内视频 |