帶走linqpad問題,我跑vbc
和csc
與/optimize+ /debug-
對這些程序:
Module f
Public Sub Main()
Dim i As Integer = 42
End Sub
End Module
和
public static class f
{
public static void Main()
{
int i = 42;
}
}
,並得到了ILDASM這些CIL結果:
對於VB:
.method public static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = (01 00 00 00)
// Code size 4 (0x4)
.maxstack 1
.locals init (int32 V_0)
IL_0000: ldc.i4.s 42
IL_0002: stloc.0
IL_0003: ret
} // end of method f::Main
對於C#:
.method public hidebysig static void Main() cil managed
{
.entrypoint
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method f::Main
所以,是,至少在這方面csc
比vbc
'聰明'。但我敢打賭,JITter會在執行時刪除任何差異。
編輯
我檢查,並實際執行的本地代碼是不同的,至少在我的系統。我把兩個Console.ReadLine()
電話給我一個機會,附加調試器,和我這些反彙編:
從VB:
00000000 sub rsp,38h
00000004 mov dword ptr [rsp+20h],0
0000000c mov rax,7FF000434D8h
00000016 mov eax,dword ptr [rax]
00000018 test eax,eax
0000001a je 0000000000000021
0000001c call FFFFFFFFE45BA230
00000021 mov dword ptr [rsp+20h],2Ah
00000029 call FFFFFFFFE26ABF20
0000002e mov qword ptr [rsp+28h],rax
00000033 nop
00000034 jmp 0000000000000036
00000036 add rsp,38h
0000003a ret
從C#:
00000000 sub rsp,38h
00000004 mov rax,7FF000534D8h
0000000e mov eax,dword ptr [rax]
00000010 test eax,eax
00000012 je 0000000000000019
00000014 call FFFFFFFFE45AA230
00000019 call FFFFFFFFE391BF20
0000001e mov qword ptr [rsp+20h],rax
00000023 nop
00000024 jmp 0000000000000026
00000026 add rsp,38h
0000002a ret
現在,我的裝配幾乎不存在,但即使我可以看到,
mov dword ptr [rsp+20h],2Ah
in來自-VB的是指十進制42的十六進制值2A
的恆定值。所以你去,它確實到底執行更多的指令。
我認爲C#編譯器進行更多的優化,目前(當羅斯林進來這幾乎肯定會發生變化)。但在這種情況下,這對C#編譯器來說有點虛假,因爲無論如何它幾乎肯定會被JIT編譯器優化。 – 2012-02-09 10:59:28
@AakashM:正如我寫的,這是我進入LinqPad.There沒有其他的代碼。 LinqPad通過在後臺編譯產生IL。 – Olaf 2012-02-09 11:00:46
它在調試中是否編譯到C#中?我假設C#在發佈模式和VB.NET時進行了更多的優化。這就是爲什麼你不能在C#中使用VB.NET中的變量來評估變量的原因之一。我更喜歡後者。 – 2012-02-09 11:01:09