SORU
4 EYLÜL 2008, PERŞEMBE


C# deyimi sınırlamalar - neden?anahtarı

Bir switch deyimi yazarken, case ifadelerine açabilirsiniz ne üzerine iki sınırlama var gibi görünüyor.

Örnek (ve muhtemelen bir object-oriented (OO) mimarlık şüpheli olduğu anlamına gelir bu tür bir şey - bu sadece yapmacık bir örnektir yapıyorsan Evet, biliyorum!)

  Type t = typeof(int);

  switch (t) {

    case typeof(int):
      Console.WriteLine("int!");
      break;

    case typeof(string):
      Console.WriteLine("string!");
      break;

    default:
      Console.WriteLine("unknown!");
      break;
  }

Burada switch() deyimi ile başarısız 'ayrılmaz bir türü beklenen Bir değeri case ifadeleri ile başarısız 'sabit Bir değer bekleniyor'.

Neden yerde, bu kısıtlamalar ve altında yatan gerekçe nedir? Herhangi bir nedenle neden geçiş ifadesi göremiyorumvardırdeğeri geçiriliyor ayrılmaz neden yapılmalı statik analiz için sadece ölmek için, ve (ilkel). Gerekçesi nedir?

CEVAP
7 EYLÜL 2008, Pazar


Önemli değil# CIL geçiş talimatı ile ifadesi geçin.

CIL anahtarı, bir atlama masası atlama adresleri kümesi içine bir dizin gerektirir.

Bu C için daha faydalı olur# anahtarın durumlarda bitişik

case 3: blah; break;
case 4: blah; break;
case 5: blah; break;

Ama az kullanmak eğer değilse:

case 10: blah; break;
case 200: blah; break;
case 3000: blah; break;

(Sadece 3 slot kullanılan boyutunda bir tablo ~3000 girişleri ihtiyacım var, istiyorum)

Bitişik olmayan ifadeler ile, derleyici if-else-if-else kontrolleri doğrusal gerçekleştirmek için başlayabilir.

Büyük bitişik olmayan ifade ayarlar ile, derleyici bir ikili ağaç-yoksa-eğer-eğer başka bir arama, ve son olarak son birkaç öğeleri ile başlayabilir.

Anlatım setleri bitişik öğeleri kümeleri içeren, derleyici ağaç arama ve CIL bir geçiş sonunda ikili olabilir.

Bu dolu "" & "mights" ve bağımlı olduğu derleyici (Mono ya da Rotor ile farklı olabilir). mays

Benim makine bitişik durumda kullanma ile ilgili sonuçları kopyaladım:

10 yolu, kolu çalıştırmak için toplam zaman, 10000 yineleme (ms) : 25.1383
(ms) 10 yol geçiş başına yaklaşık süre : 0.00251383

50 yolu, kolu çalıştırmak için toplam zaman, 10000 yineleme (ms) : 26.593
(ms) 50 şekilde geçiş başına yaklaşık süre : 0.0026593

5000 şekilde bir geçiş yürütmek için toplam zaman, 10000 yineleme (ms) : 23.7094
5000 başına yaklaşık zaman yol geçiş (ms) : 0.00237094

50000 şekilde bir geçiş yürütmek için toplam zaman, 10000 yineleme (ms) : 20.0933
(ms) 50000 şekilde geçiş başına yaklaşık süre : 0.00200933

O zaman ben de olmayan bitişik harf ifadeleri kullanıyordu:

10 yolu, kolu çalıştırmak için toplam zaman, 10000 yineleme (ms) : 19.6189
(ms) 10 yol geçiş başına yaklaşık süre : 0.00196189

500 tarafa bir geçiş yürütmek için toplam zaman, 10000 yineleme (ms) : 19.1664
(ms) 500 yol geçiş başına yaklaşık süre : 0.00191664

5000 şekilde bir geçiş yürütmek için toplam zaman, 10000 yineleme (ms) : 19.5871
5000 başına yaklaşık zaman yol geçiş (ms) : 0.00195871

Bitişik olmayan 50.000 case deyimi derlemek olmaz geçin.
"Bir ifade çok uzun veya karmaşık derlemek için 'ConsoleApplication1.yakın Program.(String []) ana'

Komik işte, ne ikili ağaç arama biraz (istatistiksel olarak muhtemelen) CİL hızlı geçiş yönergesi daha fazla gibi görünüyor.

Brian, kelime kullandım "süreklihesaplama karmaşıklığı teorisi açısından çok kesin bir anlamı vardır.", Sırada basit bitişik tamsayı örnek olabilir üretmek CIL olduğunu kabul O(1) (Sabit), seyrek bir örnektir O(log n) (logaritma), kümelenmiş örnekler yalan ikisinin arasında bir yerlerde, ve küçük örnekleridir O(n) (doğrusal).

Bu bile Generic.Dictionary<string,int32> statik oluşturulabilir Dize durum adresi yok ve ilk kullanımda kesin havai yaşayacaktır. Performans burada Generic.Dictionary performansına bağlı olacaktır.

Eğer C# Language Specification (CIL spec)işaretlerseniz switch deyimi" "sabit zaman temel uygulama bile CIL geçiş yönergesi (böyle şeyler varsayarak çok dikkatli olun) kullandığı" ya. hiç söz etmiyor "15.7.2 bulabilirsiniz

Günün sonunda, bir C# modern bir sistemde bir tamsayı ifade karşı geçiş alt mikrosaniye bir işlem, ve normalde endişesi değer değildir.


Tabii bu kez makineleri ve koşullara bağlıdır. Olmaz dikkat Bu zamanlama testleri, mikrosaniye süreleri bahsediyoruz vardır cüce tarafından herhangi bir “gerçek” kod olmanın çalıştırın (ve gerekir bazı “gerçek kod” aksi takdirde derleyici optimize eder Şubesi uzaklıkta), veya titreme sistem. Cevaplarım IL DASM CIL C tarafından oluşturulan incelemek kullanarak dayanmaktadır# derleyici. Tabii ki, bu CPU çalışır gerçek talimatları sonra JİT tarafından oluşturulan nihai değil.

86 benim makinede son CPU talimatları aslında idam kontrol var, ve basit bitişik kümesi bir anahtarı gibi bir şey yaptığını teyit edebilir:

  jmp     ds:300025F0[eax*4]

İkili ağaç arama tam olarak nerede olduğunu:

  cmp     ebx, 79Eh
  jg      3000352B
  cmp     ebx, 654h
  jg      300032BB
  …
  cmp     ebx, 0F82h
  jz      30005EEE

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Sams Page :D

    Sams Page :D

    15 Mart 2009
  • stewmurray47

    stewmurray47

    1 Kasım 2006
  • SuperPrincessjo

    SuperPrinces

    1 EKİM 2010