SORU
25 Mart 2011, Cuma


.net string sınıfı alternatif

Beri ben planlama bir uygulama yapacak BİRÇOK veri bellek, isterim için bir çeşit 'compact' string sınıfı, en az bir, hangi içerir dize biçiminde değil, daha sıfır sonlandırılmış ASCII sürümü dizesi.

Orijinal string sınıfı gibi bu tür herhangi bir dize sınıf uygulaması - bazı işlevler gerektiğini biliyor musunuz.

DÜZENLEME:

Dizeleri sıralamak ve bunları taramak mümkün, sadece kullanacağım operasyonların birkaç söz etmek istiyorum.

İdeal olarak, Sistem kaynağı ile uyumlu olacaktır.String, yani temel arama&eylem yerine uygulama bellek ayak izi optimize eder.

SAYI:

Her kayıt 10 dize 30-60 karakter olması, 100 bin kayıt var. Yani:

=57mega 100000x10x60=60000000 karakter. Neden ram 60 megs ram 120 megs yerine bunu kullanmış? İşlemler daha hızlı olacak, her şey daha sıkı olacak.

Ağaçları arama için kullanılır, ama ben bu planı düzenli taramaları yararlı olmayacaktır.

CEVAP
25 Mart 2011, Cuma


EDİT: ben şimdi adil bir miktar gider blog post on this topic daha fazla ayrıntı var.


Sizin rakamlara göre:

Her kayıt 10 dize 30-60 karakter olması, 100 bin kayıt var.

Hadi nesne yükü ekleyerek başlamak - string 20 bayt (IIRC - belki de daha fazla bir 64-bit CLR)artıgerçek veri, kaçınılmaz nesnesi yükü ve uzunluğu nedeniyle. Hadi matematik tekrar yapın:

Dize kullanarak: 20 120 1 milyon nesneleri bayt = 140MB

Yeni bir sınıf kullanarak: 20 60'da 1 milyon nesneleri bayt = 80 MB

Yine de tabii ki 60 MB bir fark amaorantılı olarakaz beklediğiniz daha. Sadece P boşluk yerine B'si kurtarıyorsun.

Şimdi konuşulacak şeyler olması daha hızlı: verilen CLR ise doğal olarak farkında string sanırım bir üçüncü sınıf mümkün olmayacaktır maçı hızı için bazı operasyonlarını, ve sen önüne koymakçokiçinde bir çok diğerleri ile aynı hızda olmak için almak için çalışıyoruz. Kuşkusuzdaha iyi önbellek tutarlılık ve kültür sorunları göz ardı ederseniz, o zaman biraz da sıra tüm karşılaştırmalar yaparak kaydetmeniz gerekir.

60 MB, benim için bu iyiliği yapmaz. Küçük bir fark, bu gün kaç tane telafi etmek için bu küçük tasarruf yaparak kazanmak zorunda olacak düşününönemliiki farklı dize türleri ile çalışan ekstra maliyet.

Tüm bunları söyledikten sonra, yine kendimi Edulinq gibi bir blog projesi olarak uygulamak oldukça etkilendim. Yok hafta ya da ay için herhangi bir sonuç bekliyoruz)

EDİT: sadece başka bir sorun düşündüm. Yukarıda elimizdeki sayılar string sınıfı özel olduğu için aslında doğru değil.. Verileri gömerdoğrudannesne - başka bir veri türü dışında dizilerden farklı olarak, string örnek büyüklüğü sabit değildir; içindeki verilere dayalı olarak değişir.

AsciiString kendi sınıf yazma, bunu yapmak mümkün olmaz - sınıf içinde bir dizi referans gömmek gerekecek:

public class AsciiString
{
    private readonly byte[] data;
}

Bu başvuru için 4 veya 8 fazladan bir bayt (veya 64-bit CLR 32) ve dize başına bir dizi nesne (16 bayt, IIRC) ek yük anlamına geliyor.

Eğer Java gibi tasarlanmış, bir dize alarak mevcut bayt dizisi (iki dizeleri payı olabilir) yeniden olabilir, ama o zaman ekstra bir uzunluk gerekiyor ve ofset AsciiString içinde. Ayrıca önbellek tutarlılık bazı faydaları kaybedersiniz.

Sanaolabilirkullanımı sadece ham bayt dizileri olarak veri yapısı, ve yazma bir sürü uzatma yöntemleri için hareket onları... ama bu korkunç olurdu, o zaman söyleyemedin arasındaki fark normal bir bayt dizisi ve hangisi olduğu anlamına geliyordu temsil etmek için bir ASCII dize.

Başka bir olasılık bu gibi bir yapı oluşturmak olacaktır

struct AsciiString
{
    private readonly byte[] data;
    ...
}

Bu etkili bir şekilde güçlü yazarak tekrar söyler, ama her şey gibi düşünmek lazım:

AsciiString x = new AsciiString();

** 10 boş bir başvuru ile sona ereceğini. Eğer x boş değer olarak etkili bir tedavi olabilir, ama hoş olmayan bir deyim olurdu.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CruzerLite

    CruzerLite

    1 EKİM 2011
  • cyriak

    cyriak

    29 Mart 2006
  • edwin maldonado

    edwin maldon

    28 Mart 2009