2013-11-28 13 views
6

Derzeit ich diesen Code verwenden für String-Byte-Array konvertiert:Schneller String byte [] Umwandlung

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

Ich nenne diese Linie sehr oft in meiner Anwendung, und ich möchte wirklich ein ein schneller bedienen. Wie kann ich eine Zeichenfolge schneller als die Standardmethode GetBytes in ein Byte-Array konvertieren? Vielleicht mit einem unsicheren Code?

+2

Sind Sie a) tatsächlich in Leistungsprobleme und b) sicher ist es dieser Teil, der diese Probleme verursacht? –

+0

Ich mag es, den Code zu optimieren, und diese Zeile ist nach dem Profiler die kritischste Zeit. – Wheeler

+0

Warum würde unsicherer Code helfen? Was lässt dich glauben, dass dieser Code ein Flaschenhals ist? Was lässt Sie glauben, dass es verbessert werden kann? Was sind Ihre Leistungsanforderungen? –

Antwort

8

Wenn Sie nicht zu viel kümmern sich um mit spezieller Codierung und den Code ist leistungskritische (zum Beispiel ist es eine Art von DB Serializer und muß Millionen Mal pro Sekunde ausgeführt werden), versuchen

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

Bearbeiten: Marshal.Copy war etwa zehn mal schneller als UTF8.GetBytes und bekommt Sie UTF-16-Codierung. Um es zurück in String zu konvertieren, können Sie verwenden:

+0

Das ist völlig bizarr. Optimieren Sie die Konvertierung in UTF8 durch, ähm, was genau? –

+0

Durch die Verwendung von UTF-16 anstelle von UTF-8 und die Tatsache, dass diese interne Speicher-Darstellung von .NET-String ist bereits in diesem Format und alles, was Sie tun müssen, um Speicherblock zu kopieren, anstatt String tatsächlich Zeichen für Zeichen zu konvertieren gewünschte Kodierung. – MagnatLU

+0

Ich kann einfach nicht sehen, wie es sich auf die Frage bezieht, die klar und absichtlich zu UTF8 konvertiert. Wenn Sie eine UTF16-Darstellung wünschen, ist der Code in Ihrer Antwort genauso sinnlos. Nimm einfach eine Kopie der String-Referenz! Warum auch nur mit Byte [] stören. Und die Verwendung von unsicherem Code scheint hier sinnlos. –