ILコードを使用してC#の演算を改善しようとしています。 1つの問題は、現在のところC#ではジェネリックの演算が許可されていませんが、少なくともプリミティブなデータ型(興味深いことに10進数ではありません)の場合はILがそうです。そのため、私は結果のILコードをチェックするためにC#でいくつかのテストメソッドを作成しました。 ここでC#メソッドのコードです:シンプルな加算メソッドが多すぎるILコードを生成する
public static float Add(float A, float B)
{
return A + B;
}
ここで結果VS2015SP2だ/リリース+最適化がオンになって。念のため :Here`sビルドからcscコマンドライン:
C:\プログラムファイル(x86の)\ MSBuildの\ 14.0 \ binに\ csc.exe/noconfig /NOWARN:1701,1702 、2008/nostdlib + /プラットフォーム: /errorreportをanycpu32bitpreferred:警告/プロンプト:4 /定義:TRACE/errorendlocation /preferreduilang:EN-US/highentropyva + /参照: "C:\プログラムファイル (x86の)\リファレンス アセンブリ\ Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.2 \ mscorlib.dll " /リファレンス:" C:\ Program Files(x86)リファレンス: "C:\ Progr参照: "C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \参考文献: アセンブリ\ Microsoft \ Framework.NETFramework \ v4.5.2 \ System.Core.dll" を参照してください。 "参照:" C:¥Program Files(x86)¥Reference アセンブリ\ Microsoft \ Framework.NETFramework \ v4.5.2 \ System.Data.dll " /reference: "参照:" C:¥Program Files(x86)¥Reference アセンブリ\マイクロソフト\フレームワーク: "C:¥Program Files(x86)¥Reference Assemblies¥Microsoft¥Framework.NETFramework¥v4.5.2¥System.dll" NETFramework \ v4.5.2 \ System.Net.Http.dll " /reference:" C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramewo "参照:" C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.2 \ System.Xml.Linq.dll " /rk \ v4.5.2 \ System.Xml.dll" /デバッグ -/filealign:512/optimize + /out:obj \ Release \ ConsoleApplication1.exe/ruleset: "C:\ Program Files (x86)\ Microsoft Visual Studio 14.0 \ Team Tools \静的分析 ツール\ルールセット\ MinimumRecommendedRules .exe " /subsystemversion:6.00/target:exe/utf8output Program.cs プロパティ\ AssemblyInfo.cs " C:\ Users \ Martin \ AppData \ Local \ Temp.NETFramework、Version = v4.5.2.AssemblyAttributes.cs " obj \ Release \ TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs obj \ Release \ TemporaryGeneratedFile_036C0B5B-1 481-4323-8D20-8F5ADCB23D92.cs OBJ \リリース\ TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs (タスクID:27)
.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
1>
がありますなぜあなたはどのような理由を知っていますかまだそれにノップ、なぜローカル変数があり、なぜ何もしない最後にジャンプがありますか?最終的なジッタがこの問題を解決する可能性はありますが、ジッタを信頼できるかどうかはわかりません。
おかげ マーティン
nopは、デバッグ設定でビルドするために発生します。クリーナーのILが必要な場合は、リリース構成でビルドすることができます。 –
本当に。私が書いたように、最適化がオンになり、リリースモードに切り替わりました。 – msedi
分岐命令コードは、メソッドの最後にブレークポイントを持つことができるようになります。 Agin、デバッグ構成のため。 –