Simple Add方法生成的IL代码太多



我正试图通过使用IL代码来改进我的C#数学运算。目前的一个问题是,C#不允许对泛型进行数学运算,但IL允许——至少对于原始数据类型(有趣的是,不允许十进制)。出于这个原因,我在C#中创建了一些测试方法来检查生成的IL代码。以下是C#方法的代码:

  public static float Add(float A, float B)
  {
        return A + B;
  }

以下是VS2015SP2/Release+Optimization打开的结果。只是为了确保:这是来自构建的csc命令行:

C: \Program Files(x86)\MSBuild\14.0\bin\csc.exe/noconfig/nowarn:170117022008/nostlib+/平台:anycpu32bit首选/errorreport:prompt/warn:4/define:TRACE/errorendlocation/preferreduilang:en US/hightentropyva+/reference:"C:\Program Files(x86)\参考程序集\Microsoft\Framework.NETFramework\v4.5.2 \Microsoft.CSharp.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2\mscorlib.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Core.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Data.DataSetExtensions.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Data.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2\System.Net.Http.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Xml.dll"/reference:"C:\Program Files(x86)\reference程序集\Microsoft\Framework.NETFramework\v4.5.2 \System.Xml.Linq.dll"/debug-/filealign:512/优化+/out:obj\Release\ConsoleApplication1.exe/ruleset:"C:\Program Files(x86)\Microsoft Visual Studio 14.0\团队工具\静态分析Tools\Rule Sets\MinimumRecommendedRules.ruleset"/子系统版本:6.00/target:exe/utf8output Program.cs属性\AssemblyInfo.csC:\Users\Martin\AppData\Local\Temp.NETFramework,版本=v4.5.2。AssemblyAttributes.csobj\Release \临时生成文件_E7A71F3-0F8D-4B9B-B56E-8E70B10BC5D3.csobj\Release \临时生成文件_036C0B5B-1481-4323-8D20-8F5ADCB23D92.csobj\Release \临时生成文件_5937a6070-0e60-4077-877b-f7221da3dda1.cs(任务ID:27)1>

    .method public hidebysig static 
    float32 Add (
        float32 A,
        float32 B
    ) cil managed 
{
    // Method begins at RVA 0x2054
    // Code size 9 (0x9)
    .maxstack 2
    .locals init (
        [0] float32
    )
    IL_0000: nop
    IL_0001: ldarg.0
    IL_0002: ldarg.1
    IL_0003: add
    IL_0004: stloc.0
    IL_0005: br.s IL_0007
    IL_0007: ldloc.0
    IL_0008: ret
} // end of method Program::Add

你知道为什么它仍然没有,为什么有一个局部变量,为什么结尾有一个跳跃,什么都不做吗?

我很清楚,最终的抖动可能会解决这个问题,但如果我看到这个,我不知道,我是否可以相信抖动。

谢谢Martin

恐怕我不能重复您的结果。使用csc/debug-/optimite+编译,然后使用ildasm,我得到:

.method public hidebysig static float32  Add(float32 A,
                                             float32 B) cil managed
{
  // Code size       4 (0x4)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  add
  IL_0003:  ret
} // end of method Program::Add

这就是我对优化代码的期望。事实上,如果我改为优化-,我会得到你发布的代码。您是否正在检查调试与发布子目录?

相关内容

  • 没有找到相关文章

最新更新