查看C#编译代码以进行可能的优化(无分支)

时间:2020-10-07 13:04:37

标签: c# visual-studio-2019

是否有可能在Visual Studio中看到编译的c#代码(将其编译为Assembly / IL时)?

我正在研究无分支编程,并且想比较不同函数如何编译以获得更好的优化。 (注意:我目前仅使用秒表来计时完成功能所需的时间。)

在此之前,我无法在任何地方找到有关此信息。

3 个答案:

答案 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