2016-04-07 9 views
4

Ich versuche, meine C# -Mathe-Operationen mit IL-Code zu verbessern. Ein Problem ist derzeit, dass C# keine mathematischen Operationen für Generics erlaubt, aber die IL - zumindest für die primitiven Datentypen (interessanterweise nicht dezimal). Aus diesem Grund habe ich eine Testmethode in C# erstellt, um den resultierenden IL-Code zu überprüfen. Hier ist der Code der C# Methode:Einfache Add-Methode erzeugt zu viel IL-Code

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

Hier ist das Ergebnis VS2015SP2/Veröffentlichung + Optimierungen eingeschaltet. Nur um sicherzugehen: Hier `s der csc-Befehlszeile aus dem Build:

C: \ Program Files (x86) \ MSBuild \ 14.0 \ bin \ csc.exe/noconfig /nowarn: 1701,1702 2008/nostdlib +/Plattform: anycpu32bitpreferred /ERRORREPORT: Prompt/warnen: 4/definieren: TRACE/errorendlocation /preferreduilang: en-US/highentropyva +/Referenz: "C: \ Program Files (x86) \ Referenz Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.2 \ Microsoft.CSharp.dll " /Referenz:" C: \ Programme (x86) \ Referenz Assemblys \ Microsoft \ Framework.NETFramework \ v4.5.2 \ mscorlib.dll " /Referenz: "C: \ Progr am Dateien (x86) \ Referenz Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.2 \ System.Core.dll " /Referenz:" C: \ Programme (x86) \ Referenz Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.2 \ System.Data.DataSetExtensions.dll " /Referenz:" C: \ Programme (x86) \ Referenz Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.2 \ System.Data.dll " /Referenz: "C: \ Programme (x86) \ Referenz Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.2 \ System.dll" /Referenz: "C: \ Programme (X 86) \ Referenz Assemblies \ Microsoft \ Framework. NETFramework \ v4.5.2 \ System.Net.Http.dll " /Referenz:" C: \ Programme (x86) \ Referenz Assemblys \ Microsoft \ Framework.NETFramewo rk \ v4.5.2 \ System.Xml.dll " /Referenz:" C: \ Programme (x86) \ Referenz Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.2 \ System.Xml.Linq.dll " /debug-/filealign: 512/optimieren + /out:obj\Release\ConsoleApplication1.exe/ruleset: "C: \ Programme (X 86) \ Microsoft Visual Studio 14.0 \ Team Tools \ statische Analyse Tools \ Rule Sets \ MinimumRecommendedRules .ruleset " /subsystemversion:6.00/target: exe/utf8output Programm.cs Eigenschaften \ AssemblyInfo.cs " C: \ Benutzer \ Martin \ AppData \ Local \ Temp.NETFramework, Version = v4.5.2.AssemblyAttributes.cs " obj \ Freigabe \ TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs obj \ Freigabe \ TemporaryGeneratedFile_036C0B5B-1 481-4323-8D20-8F5ADCB23D92.cs obj \ Release \ TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs (TaskId: 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 

Haben Sie Grund, warum gibt es immer noch nicht drin, warum gibt es eine lokale Variable und warum gibt es einen Sprung am Ende, der nichts tut?

Es ist mir klar, dass der letzte Jitter das lösen könnte, aber wenn ich das sehe, weiß ich nicht, ob ich dem Jitter vertrauen kann.

Dank Martin

+0

NOP kommt, weil Sie Debug-Konfiguration erstellen. Wenn Sie eine sauberere IL wünschen, können Sie eine Release-Konfiguration erstellen. –

+0

Nicht wirklich. Wie ich schrieb, sind Optimierungen eingeschaltet und ich wechselte in den Freigabemodus. – msedi

+0

Mit dem Verzweigungsoperationscode können Sie einen Breakpoint am Ende der Methode erstellen. Agin, wegen der Debug-Konfiguration. –

Antwort

2

Ich fürchte, ich nicht Ihre Ergebnisse wiederholen.Kompilieren mit csc/Debug-/optimize + und dann ildasm verwenden, erhalte ich:

.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 

das ist, was ich von optimierten Code erwarten würde. In der Tat, wenn ich zur Optimierung ändere, bekomme ich den Code, den Sie gepostet haben. Untersuchen Sie möglicherweise ein Debug vs. Release-Unterverzeichnis?

+0

Das ist genau das, was ich bekomme. Ich bekomme OP-Code, wenn ich Optimierungen deaktiviere. – Rob

+0

Hallo Jesse und Rob. Manchmal hilft es, dass mir jemand zeigt, wie dumm ich bin. Du hattest absolut Recht Jesse. – msedi

Verwandte Themen