2013-11-28 20 views
6

Obecnie używam tego kodu do konwertowania ciąg do tablicy bajtów:Szybka ciąg byte [] konwersji

var tempByte = System.Text.Encoding.UTF8.GetBytes(tempText); 

Wzywam tej linii bardzo często w mojej aplikacji i naprawdę chcę użyć szybszej. Jak mogę przekonwertować ciąg na tablicę bajtów szybciej niż domyślna metoda GetBytes? Może z niebezpiecznym kodem?

+2

Czy faktycznie) masz problemy z wydajnością i b) czy to właśnie ta część powoduje te problemy? –

+0

Chciałbym zoptymalizować kod, a ta linia jest najbardziej krytyczna w czasie, zgodnie z profilerem. – Wheeler

+0

Dlaczego niebezpieczny kod byłby pomocny? Co sprawia, że ​​uważasz, że ten kod jest wąskim gardłem? Co sprawia, że ​​myślisz, że można go ulepszyć? Jakie są twoje wymagania dotyczące wydajności? –

Odpowiedz

8

Jeśli nie dbają zbytnio o użyciu konkretnego kodowania i kod jest wydajność krytycznych (na przykład, że to jakiś rodzaj DB serializatora i musi być uruchamiane miliony razy na sekundę), spróbuj

fixed (void* ptr = tempText) 
{ 
    System.Runtime.InteropServices.Marshal.Copy(new IntPtr(ptr), tempByte, 0, len); 
} 

Edytuj: Marshal.Copy był około dziesięć razy szybszy niż UTF8.GetBytes i pobiera kodowanie UTF-16. Aby przekonwertować go z powrotem na ciąg, możesz użyć:

fixed (byte* bptr = tempByte) 
{ 
    char* cptr = (char*)(bptr + offset); 
    tempText = new string(cptr, 0, len/2); 
} 
+0

To jest całkowicie dziwaczne. Zoptymalizuj konwersję na UTF8 przez, er, co dokładnie? –

+0

Używając UTF-16 zamiast UTF-8 i eksplodując fakt, że wewnętrzna reprezentacja pamięci ciąg .NET jest już w tym formacie i wszystko, co musisz zrobić, aby go uzyskać, to blok pamięci, zamiast faktycznie konwertować ciąg znaków przez znak do pożądane kodowanie. – MagnatLU

+0

Po prostu nie widzę, w jaki sposób odnosi się do pytania, które wyraźnie i celowo konwertuje do UTF8. Jeśli chcesz reprezentacji UTF16, kod w twojej odpowiedzi jest równie bezcelowy. Po prostu weź kopię odwołania do łańcucha! Po co zawracać sobie głowę bajtem []. Używanie niebezpiecznego kodu również wydaje się bezcelowe. –