Schnellster Weg (performance-weise) um einen String in ein byte [] Array in C # umzuwandeln

7

Was ist der schnellste Weg, um eine Zeichenkette in C # zu einem Array byte [] umzuwandeln? Ich sende Tonnen von String-Daten durch Sockets und muss jeden einzelnen Vorgang optimieren. Derzeit transformiere ich die Strings vor dem Senden in byte [] - Arrays mit:

%Vor%     
Nosrama 26.08.2009, 22:30
quelle

8 Antworten

15

Wenn alle Ihre Daten wirklich ASCII sind, dann können Sie es vielleicht etwas schneller als ASCIIEncoding machen, was verschiedene (völlig sinnvolle) Fehlerbehandlungen usw. hat. Sie kann es auch in der Lage sein, es zu beschleunigen, indem vermieden wird, ständig neue Byte-Arrays zu erzeugen. Angenommen, Sie haben eine obere Grenze, unter der alle Ihre Nachrichten liegen:

%Vor%

Sie würden dann etwas tun wie:

%Vor%

Das ist eine ziemlich verzweifelte Optimierung. Ich würde bei ASCIIEncoding bleiben, bis ich bewiesen hätte , dass dies der Flaschenhals war (oder zumindest, dass diese Art von Hacker nicht hilft).

    
Jon Skeet 26.08.2009, 22:47
quelle
9

Ich würde sagen, dass es jetzt viel besser ist, wie du es machst. Wenn Sie sich wirklich mit der Optimierung auf sehr niedrigem Niveau befassen, ist die beste Empfehlung, die ich machen kann, Reflector zu bekommen. Mit Reflector können Sie sich den Code selbst anschauen (die meiste Zeit) und sehen, was die Algorithmen sind. Wenn reflector Sie nicht anzeigt, können Sie immer Microsofts SSCLI (Common Language Infrastructure für gemeinsam genutzte Quellen) herunterladen, um den C ++ - Code hinter MethodImplOptions.InternalCall-Methoden anzuzeigen.

Als Referenz hier die tatsächliche Implementierung von Encoding.ASCII.GetBytes:

%Vor%     
jrista 26.08.2009 22:34
quelle
1

Was möchten Sie optimieren? ZENTRALPROZESSOR? Bandbreite?

Wenn Sie die Bandbreite optimieren möchten, können Sie versuchen, die Zeichenfolgedaten vorher zu komprimieren.

Profiliere zuerst deinen Code, finde heraus, was die langsamen Bits sind, bevor du versuchst, auf einer so niedrigen Stufe zu optimieren.

    
Nader Shirazie 26.08.2009 22:40
quelle
1

Ich stelle mir vor, dass die Funktion GetBytes () bereits gut dafür optimiert ist. Ich kann mir keine Vorschläge vorstellen, um die Geschwindigkeit Ihres bestehenden Codes zu verbessern.

EDIT - Weißt du, ich weiß nicht, ob das schneller ist oder nicht. Aber hier ist eine andere Methode, die den BinaryFormatter verwendet:

%Vor%

Der Grund, warum möglicherweise schneller ist, ist, dass der Codierungsschritt übersprungen wird. Ich bin mir auch nicht ganz sicher, ob das richtig funktioniert. Aber du könntest es versuchen und sehen. Wenn Sie die ASCII-Codierung benötigen, hilft das natürlich nicht.

Ich hatte gerade einen anderen Gedanken. Ich glaube, dass dieser Code die doppelte Anzahl an Bytes zurückgeben würde als GetBytes mit ASCII-Codierung. Der Grund dafür ist, dass alle Strings in .NET Unicode hinter den Kulissen verwenden. Und natürlich verwendet Unicode 2 Bytes pro Zeichen, während ASCII nur 1 verwendet. Daher ist der BinaryFormatter in diesem Fall wahrscheinlich nicht das Richtige, da Sie die Menge der Daten, die Sie über den Socket senden, verdoppeln würden.

>     
Steve Wortham 26.08.2009 22:34
quelle
1

Ohne Hinweise auf Ihre Nebenläufigkeitsanforderungen (oder irgendetwas anderes): Können Sie im ThreadPool einige Threads erzeugen, die die Zeichenfolgen in Bytearrays konvertieren und sie in eine Warteschlange ablegen, während ein weiterer Thread die Warteschlange überwacht und die Daten sendet ?

    
Ed Power 27.08.2009 00:44
quelle
0

Wie andere schon gesagt haben, ist die Codierungsklasse bereits für diese Aufgabe optimiert, daher wird es wahrscheinlich schwierig sein, sie schneller zu machen. Es gibt eine Mikrooptimierung, die Sie tun könnten: Verwenden Sie Encoding.ASCII anstatt new ASCIIEncoding() . Aber wie alle wissen, sind Mikrooptimierungen schlecht;)

    
Thomas Levesque 26.08.2009 22:41
quelle
0

Ich würde vorschlagen, zu profilieren, was Sie tun. Ich finde es zweifelhaft, dass die Geschwindigkeit der Umwandlung einer Zeichenfolge in ein Byte-Array ein größeres Problem im Durchsatz ist als die Geschwindigkeit des Sockets selbst.

    
kyoryu 27.08.2009 01:48
quelle
0

Noch ein Tipp: Ich weiß nicht, wie Sie Ihre anfänglichen Strings erstellen, aber denken Sie daran, dass StringBuilder.Append ("etwas") wirklich schneller ist als etwas wie myString +="etwas".

Im gesamten Prozess des Erstellens der Zeichenfolgen und des Sendens über eine Socket-Verbindung wäre ich überrascht, wenn der Flaschenhals die Umwandlung von Zeichenfolgen in Byte-Arrays wäre. Aber ich bin sehr interessiert, wenn jemand das mit einem Profiler testen würde.

Ben

    
user186314 08.10.2009 11:47
quelle

Tags und Links