2016-04-07 11 views
4

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>

がありますなぜあなたはどのような理由を知っていますかまだそれにノップ、なぜローカル変数があり、なぜ何もしない最後にジャンプがありますか?

最終的なジッタがこの問題を解決する可能性はありますが、ジッタを信頼できるかどうかはわかりません。

おかげ マーティン

+0

nopは、デバッグ設定でビルドするために発生します。クリーナーのILが必要な場合は、リリース構成でビルドすることができます。 –

+0

本当に。私が書いたように、最適化がオンになり、リリースモードに切り替わりました。 – msedi

+0

分岐命令コードは、メソッドの最後にブレークポイントを持つことができるようになります。 Agin、デバッグ構成のため。 –

答えて

2

私は私はあなたの結果を繰り返すことはできません怖いです。CSC /デバッグ - /最適化+でコンパイルしてから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 

私は最適化されたコードから期待するものです。実際、私がoptimize-に変更すると、あなたが投稿したコードが得られます。デバッグ対リリースのサブディレクトリをチェックしていますか?

+0

これはまさに私が得るものです。最適化を無効にすると、私はOPコードを取得します。 – Rob

+0

こんにちはジェシーとロブ。時々、誰かが私の愚かさを私に見せてくれるのに役立ちます。あなたは絶対に正しかった。 – msedi

関連する問題