是否有可能在Visual Studio中看到编译的c#代码(将其编译为Assembly / IL时)?
我正在研究无分支编程,并且想比较不同函数如何编译以获得更好的优化。 (注意:我目前仅使用秒表来计时完成功能所需的时间。)
在此之前,我无法在任何地方找到有关此信息。
答案 0 :(得分:1)
您可以使用SharpLab(https://sharplab.io/)之类的在线编译器/审阅器
这里还有其他人,我从来没有将它们进行过正面比较,以了解它们是否有所不同。
答案 1 :(得分:0)
使用BenchMark.Net
运行代码。
它使您可以使用[DisassemblyDiagnoser]
attribute装饰代码,该代码将输出以下内容:
; .NET Framework 4.7.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.3110.0
05452718 BenchmarkDotNet.Samples.IntroDisassembly.Sum()
IL_0000: ldc.r8 0
IL_0009: stloc.0
0545271c d9ee fldz
IL_000a: ldc.i4.0
IL_000b: stloc.1
IL_000c: br.s IL_0017
0545271e 33c0 xor eax,eax
IL_000e: ldloc.0
IL_000f: ldloc.1
IL_0010: conv.r8
IL_0011: add
IL_0012: stloc.0
05452720 8945fc mov dword ptr [ebp-4],eax
05452723 db45fc fild dword ptr [ebp-4]
05452726 dec1 faddp st(1),st
IL_0013: ldloc.1
IL_0014: ldc.i4.1
IL_0015: add
IL_0016: stloc.1
05452728 40 inc eax
IL_0017: ldloc.1
IL_0018: ldc.i4.s 64
IL_001a: blt.s IL_000e
05452729 83f840 cmp eax,40h
0545272c 7cf2 jl 05452720
IL_001c: ldloc.0
IL_001d: ret
0545272e 8be5 mov esp,ebp
作为一项奖励,BenchMark.Net为您的代码提供了丰富的性能指标,并有助于防止由于热身编译和垃圾收集(以及其他原因)引起的偏斜。如果您有兴趣测量和比较代码的性能,可以使用该规范包。
例如,Stephen Toub在illustrate some of the improvements in the Jitter for .Net Core 5.0中使用了此功能。
答案 2 :(得分:0)
为此,我使用ReSharper,它使您可以直接从VisualStudio执行此操作。除非您是学生,否则它的价格会很高,因为这只是其中的一小部分功能。
https://www.jetbrains.com/help/resharper/Viewing_Intermediate_Language.html