2013-06-01 10 views
10

To mogło być wcześniej zadawane, ale nie mogę znaleźć takich wpisów. Czy istnieje klasa do pracy ze stringami ASCII? Korzyści są liczne:Szybka i wydajna pamięć klasy ASCII dla .NET

  1. Porównanie powinno być szybsze od jej tylko bajt-do-bajta (zamiast UTF-8 ze zmiennym kodowaniu)
  2. pamięci skuteczny, należy użyć około połowy pamięci w dużych ciągów
  3. Szybsze wersje ToUpper()/tolower(), które używają Look-Up-Table, który jest językiem niezmienna

Jon Skeet napisał podstawową AsciiString implementation i udowodnił # 2, ale zastanawiam się, czy ktoś wziął to dalej i ukończyli taką klasę. Jestem pewien, że byłyby zastosowania, chociaż nikt zwykle nie wybierałby takiej trasy, ponieważ wszystkie istniejące funkcje String musiałyby zostać ponownie zaimplementowane ręcznie. A konwersje między Stringami będą rozrzucone wszędzie, komplikując prosty program.

Czy istnieje taka klasa? Gdzie?

+7

Kilka uwag: Ciąg .NET używa wewnętrznie UTF-16 i można znacznie przyspieszyć porównanie za pomocą [String.Compare] (http://msdn.microsoft.com/en-us/ library/e6883c06.aspx), które pobiera parametr [StringComparison] (http://msdn.microsoft.com/en-us/library/system.stringcomparison.aspx) i ustawia go na wartość porządkową. – Dirk

+2

Zwykłe porównanie wykorzystuje bezpośrednio wartości całkowite kodowania UTF-16. Nie bierze pod uwagę aktualnej kultury ani tego, czy ten sam symbol znaku może być opisany przez więcej niż jeden kodowy kod Unicode. Porównanie tych normalnie zwraca wartość true, ale wartość false, gdy używana jest liczba porządkowa. – Dirk

+0

Tak, niektóre inne funkcje ciągów również pobierają parametr StringComparison, w tym [String.IndexOf] (http://msdn.microsoft.com/en-us/library/system.string.indexof.aspx). – Dirk

Odpowiedz

6

Pomyślałem, że opublikuję wynik moich starań, aby wdrożyć system opisany z tak dużą ilością wsparcia i kompatybilności, jak tylko mogłem. Prawdopodobnie nie jest doskonały, ale powinien dać ci przyzwoitą podstawę do poprawy w razie potrzeby.

Łańcuch ASCIIChar struct i ASCIIString pośrednio konwertuje do swoich natywnych odpowiedników dla łatwości użycia.

Propozycja OP dotycząca zamiany ToUpper/Lower itd. Została wdrożona znacznie szybciej niż lista odnośników, a wszystkie operacje są tak szybkie i przyjazne dla pamięci, jak tylko mogłem je wykonać.

Niestety nie można opublikować źródła, było zbyt długo. Zobacz linki poniżej.

  • ASCIIChar - Zastępuje char, przechowuje wartość w bajt zamiast int i zapewnia metody wsparcia i kompatybilności dla klasy String. Implementuje wirtualne wszystkie metody i właściwości dostępne dla char.

  • ASCIIChars - Zapewnia statyczne właściwości dla każdego z prawidłowych znaków ASCII dla łatwości użycia.

  • ASCIIString - Zastępuje łańcuch, przechowuje znaki w tablicy bajtów i implementuje praktycznie wszystkie metody i właściwości dostępne dla łańcucha znaków.

+0

Po prostu super! Pełna klasa ASCIIString z przyspieszoną implementacją metod identycznych z API klasy String! Fantastyczna praca .... –

+0

Ale czy jest niezmienna? –

+1

@PeterLaCombJr. Tak zarówno struktura znaków, jak i klasa łańcuchowa są niezmienne (jedyną zmienną lokalną jest tylko do odczytu). – Ashigore

-2

Dotnet nie obsługuje bezpośrednio łańcuchów znaków ASCII. Ciągi mają format UTF16, ponieważ interfejs API systemu Windows działa tylko z kodami ASCII (onr char - one byte) lub UTF16. Utf8 będzie najlepszym rozwiązaniem (java używa go), ale .NET nie obsługuje go, ponieważ system Windows nie.


Windows API może konwertować pomiędzy zestawami znaków, ale Windows API działa tylko 1 bajt znaków lub 2 bajtowych znaków, więc jeśli używasz ciągów UTF8 w .NET trzeba konwertować je za każdym razem, który ma wpływ na performance. Dotnet może korzystać z UTF8 i innych dziedzin za pośrednictwem BinaryWriter/BinaryReader lub prostego StreamWriter/StreamReader.

+1

To nie odpowiada na pytanie, które zostało zadane. To powinien być komentarz. Nie masz wystarczającej liczby przedstawicieli, aby to skomentować, ale to jest po prostu trudne. Zyskaj rep, a następnie możesz komentować. Możesz uzyskać powtórkę, odpowiadając na pytania z prawdziwymi odpowiedziami. –

Powiązane problemy