SORU
24 EYLÜL 2008, ÇARŞAMBA


.NET Tamsayı vs Int16?

Şüpheli bir kodlama yöntemi var.

32000 altında olan öğelerin küçük bir liste boyunca yineleme yapmak için ihtiyacım olduğunda benim için Int16 kullanıyorumbendeğişken türü yerine Integer. Int16 kullanarak tam Integer havaya göre daha verimli olduğunu düşünüyorum, çünkü bu benim.

Yanılıyor muyum? Int16 vs Integer kullanma arasında etkili bir performans farkı var mı? Int16 kullanarak durdurmak ve sadece sayma/yineleme benim ihtiyaçları için Integer ile sopa gerekir?

CEVAP
24 EYLÜL 2008, ÇARŞAMBA


Gerekirhemen hemen her zamanInt32 Int64 dizin tarafından bir dizi ya da koleksiyon döngü bittiğinde (ve hayır, UInt32 UInt64 kullanarak kredi alamadım) kullanın.

Daha az verimli olduğunu en bariz nedeni, tüm dizi ve koleksiyon dizinleri KORUYUCU bulundu Int32s al, örtülü bir dökümher zamangerçekleşmesi için bir dizin olarak Int16s kullanmaya çalışan bir kod olacak.

Daha az belirgin nedeni (ve diziler dizin olarak Int32 sebebi) CİL belirtimi operasyon yığını tüm değerleri olduğunu söylediyaInt32 Int64. Her zaman sana da yük veya mağaza bir değer için başka bir tamsayı Türü (Byte, SByte, UInt16, Int16, UInt32, ya UInt64), orada bir örtük dönüştürme işlemi dahil. İmzasız türleri yükleme için herhangi bir ceza var, ama değeri saklamak için, bu bir kesilme ve olası taşma kontrol etmek için tutarlar. İmzalı türleri içinheryük kayıt uzanır, ve her oturum çöker (ve olası taşma kontrol) saklayın.

Bu sana en çok acı verecek yere döngünün kendisi değil, dizi erişir. Örneğin masum görünümlü bu döngü atın:

for (short i = 0; i < 32000; i  ) {
    ...
}

Güzel görünüyor, değil mi? Hayır! Bu sadece bir kez olur bu yana temelde başlatma (short i = 0) göz ardı edebilirsiniz, ama karşılaştırma (i<32000) ve artan (i ) parçalar 32000 kere olur. İşte bu şey gibi makine seviyesinde görünüyor ne için pesudo-kodu:

  Int16 i = 0;
LOOP:
  Int32 temp0 = Convert_I16_To_I32(i); // !!!
  if (temp0 >= 32000) goto END;
  ...
  Int32 temp1 = Convert_I16_To_I32(i); // !!!
  Int32 temp2 = temp1   1;
  i = Convert_I32_To_I16(temp2); // !!!
  goto LOOP;
END:

Vardır3çalıştırılan orada dönüşümleri32000kere. Tamamen ve sadece Int32 Int64 kullanarak Kaçınılması olabilirdi.

Şimdi ben yorum dedim, bu konuyla ilgili bir blog yazısı, .NET Integral Data Types And You . yazılı aslında güncelleme:

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • NLthomas21

    NLthomas21

    20 Mayıs 2008
  • UKF

    UKF

    2 Aralık 2009