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
NOP kommt, weil Sie Debug-Konfiguration erstellen. Wenn Sie eine sauberere IL wünschen, können Sie eine Release-Konfiguration erstellen. –
Nicht wirklich. Wie ich schrieb, sind Optimierungen eingeschaltet und ich wechselte in den Freigabemodus. – msedi
Mit dem Verzweigungsoperationscode können Sie einen Breakpoint am Ende der Methode erstellen. Agin, wegen der Debug-Konfiguration. –