aşağıdaki kodu derleyin:
Bu benim son birinden bir türevi sorudur.
public static int Main(string[] args)
{
switch (args[0])
{
case "x": return 1;
case "y": return 2;
case "z": return 3;
}
return 0;
}
Şimdi, IL # derleyicisi oluşturur Cı incelemek
Reflector veya
ILDASM kullanın. Vaka ifadeleri eklemeye devam edin ve derleme yapın ve sonucu gözlemleyin.
- Kasa ifadelerinin sayısı küçükse, derleyici sıralı bir eşitlik karşılaştırması gönderir.
- durum açıklamalarının sayısı büyükse
sonra derleyici bir
Dictionary
arama yayar.
C# 3.0 derleyicisini kullanıyordum ve stratejinin 7 vaka ifadesinde değiştiğini gözlemledim. C# 4.0 ve diğerleri ile benzer bir şey göreceğinizden şüpheleniyorum.
Güncelleme:
Ben bunu daha sonra kullanmak üzere sözlüğe inşa ediyor IL çıktı Dictionary.Add
çağrıları göreceği işaret etmelidir. Bu her zaman olur düşüncesine aldanmayın. Derleyici aslında ayrı bir statik sınıf üretiyor ve satır içi statik başlatılıyor. L_0026 adresindeki talimatlara özellikle dikkat edin. Sınıf zaten başlatılmışsa, şube Add
çağrılarını atlayacaktır.
L_0021: ldsfld class [mscorlib]System.Collections.Generic.Dictionary`2<string, int32> <PrivateImplementationDetails>{816396DD-F271-4C12-83D0-CC9C9CD67AD6}::$$method0x6000001-1
L_0026: brtrue.s L_0089
L_0028: ldc.i4.7
L_0029: newobj instance void [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::.ctor(int32)
L_002e: dup
L_002f: ldstr "x"
L_0034: ldc.i4.0
L_0035: call instance void [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::Add(!0, !1)
L_003a: dup
L_003b: ldstr "y"
L_0040: ldc.i4.1
L_0041: call instance void [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::Add(!0, !1)
L_0046: dup
L_0047: ldstr "z"
L_004c: ldc.i4.2
L_004d: call instance void [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::Add(!0, !1)
Ayrıca, sözlüğün aslında orijinal dizeden tamsayıya kadar bir harita içerdiğini de unutmayın. Bu tam sayı, IL'de ayrı bir anahtar oluşturmak için kullanılır. o VB.NET onun Select
yapı için bu aynı optimizasyon sahip görünmüyor değer Ne için
:
L_0089: volatile.
L_008b: ldsfld class [mscorlib]System.Collections.Generic.Dictionary`2<string, int32> <PrivateImplementationDetails>{816396DD-F271-4C12-83D0-CC9C9CD67AD6}::$$method0x6000001-1
L_0090: ldloc.2
L_0091: ldloca.s CS$0$0002
L_0093: call instance bool [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::TryGetValue(!0, !1&)
L_0098: brfalse.s L_00da
L_009a: ldloc.3
L_009b: switch (L_00be, L_00c2, L_00c6, L_00ca, L_00ce, L_00d2, L_00d6)
L_00bc: br.s L_00da
L_00be: ldc.i4.1
L_00bf: stloc.1
L_00c0: br.s L_00de
L_00c2: ldc.i4.2
L_00c3: stloc.1
L_00c4: br.s L_00de
L_00c6: ldc.i4.3
Güncelle 2. yeni derleyiciler yerine Sözlük inşaat isabet bir karma üzerinde ComputeStringHash()
ve sonra dize karşılaştırma kullanmak gibi
sen benim cevap gördünüz mü? Dize üzerindeki anahtar ifadelerinin, vaka ifadelerinin sayısı belirli bir eşiğe ulaşırsa, bir 'Sözlük' araması haline getirildiğini özellikle belirttim. –
Brian, yazının bir bölümünü gördün. Bu konuyla ilgili belgelere işaret edebilir misin? Çakışan cevaplar buluyorum. Yardım için teşekkürler. –
Konuyla ilgili resmi belgeleri (ara sıra blog yazısı dışında) bulmakta zorlanacaksınız. Bunun sebebi, bu bir uygulama detayıdır.Bacak işini yapmak için –