2017-03-18 4 views

答えて

3

にこれらを最適化します。あなたはDebug - >Windows - >DisassemblyのVisual Studioで逆アセンブラを開くことができます。私はこれを書いた:

 int a, b; 
     a = Convert.ToInt32(Console.ReadLine()); 

     b = a/1; 
     b = a * 1; 
     b = a + 0; 
     b = a - 0; 
     b = a << 0; 
     b = a >> 0; 

     Console.WriteLine("{0}", b); 

そして最適化をデバッグビルドで有効にした。

000007FE974040F4 E8 F7 62 D1 5E  call  000007FEF611A3F0 
000007FE974040F9 89 45 E4    mov   dword ptr [rbp-1Ch],eax 
000007FE974040FC 8B 4D E4    mov   ecx,dword ptr [rbp-1Ch] 
000007FE974040FF 89 4D EC    mov   dword ptr [rbp-14h],ecx 
      b = a/1; 
000007FE974242C2 8B 4D EC    mov   ecx,dword ptr [rbp-14h] 
000007FE974242C5 89 4D E8    mov   dword ptr [rbp-18h],ecx 
      b = a * 1; 
000007FE974242C8 8B 4D EC    mov   ecx,dword ptr [rbp-14h] 
000007FE974242CB 89 4D E8    mov   dword ptr [rbp-18h],ecx 
      b = a + 0; 
000007FE974242CE 8B 4D EC    mov   ecx,dword ptr [rbp-14h] 
000007FE974242D1 89 4D E8    mov   dword ptr [rbp-18h],ecx 
      b = a - 0; 
000007FE974242D4 8B 4D EC    mov   ecx,dword ptr [rbp-14h] 
000007FE974242D7 89 4D E8    mov   dword ptr [rbp-18h],ecx 
      b = a << 0; 
000007FE974242DA 8B 4D EC    mov   ecx,dword ptr [rbp-14h] 
000007FE974242DD 89 4D E8    mov   dword ptr [rbp-18h],ecx 
      b = a >> 0; 
000007FE974242E0 8B 4D EC    mov   ecx,dword ptr [rbp-14h] 
000007FE974242E3 89 4D E8    mov   dword ptr [rbp-18h],ecx 

あなたはそれだけでabに6回のコピーだ、アセンブリ命令は、各ラインの正確な同じです見ることができます:解体では、私はこれを得ました。実際には、それは単一のb=a命令に全体を最適化していないことに驚いています。私はConsole.WriteLineをコメントアウトした場合それはありません:

000007FE974041D4 E8 17 62 D1 5E  call  000007FEF611A3F0 
000007FE974041D9 89 45 E8    mov   dword ptr [rbp-18h],eax 
000007FE974041DC 8B 45 E8    mov   eax,dword ptr [rbp-18h] 
000007FE974041DF 89 45 EC    mov   dword ptr [rbp-14h],eax 

      b = a/1; 
000007FE974041E2 90     nop 
      b = a * 1; 
      b = a + 0; 
      b = a - 0; 
      b = a << 0; 
      b = a >> 0; 

     // Console.WriteLine("{0}", b); 

     } 
000007FE974041E3 90     nop 

私は驚いて場合ことで、それが使用されることはありませんので、それは、完全にbを最適化しませんが。多分誰かがそれを説明することができます。

+0

答えは、OPが「JITされたコードの最後から冗長な割り当てを取り除いてもよいか」という質問には興味がありません。正確な質問に答えると、ASMではなくILが表示されます。 –

+0

ツールを指摘してくれてありがとうございました。 – Hugoagogo

+0

ようこそ。 2番目のコードをもう一度見てみると、実際には 'b'を最適化していることがわかります。最初の3つの' mov'命令は 'Convert.Int32()'の結果を 'a'にコピーしています。しかし、あなたは 'a'も最適化し、関数呼び出しの結果を無視すると思うでしょう。しかたがない。 – smead

関連する問題