Schnellste Weg, um konvertieren von int, 4 bytes in C#
Was ist der Schnellste Weg, um konvertieren von int, 4 bytes in C# ?
Schnellsten, wie in der Ausführungszeit nicht der Entwicklung der Zeit.
Meine eigene Lösung ist dieser code:
byte[] bytes = new byte[4];
unchecked
{
bytes[0] = (byte)(data >> 24);
bytes[1] = (byte)(data >> 16);
bytes[2] = (byte)(data >> 8);
bytes[3] = (byte)(data);
}
Recht, jetzt sehe ich, dass meine Lösung übertrifft beide struct
und BitConverter
durch paar Zecken.
Ich denke, das unsichere ist wohl die Schnellste option, und akzeptieren, dass als Antwort, aber ich würde lieber eine managed-option.
InformationsquelleAutor der Frage MichaelT | 2012-01-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein-byte* Guss mit unsicherer code ist mit Abstand der Schnellste:
Das ist, was BitConverter als auch nicht, dieser code verhindert den Kosten für die Erstellung der Arrays.
InformationsquelleAutor der Antwort Hans Passant
Mit einem BitConverter und es ist GetBytes überlastung, übernimmt eine 32-bit-integer:
InformationsquelleAutor der Antwort Darin Dimitrov
Ich habe getan, Forschung auf die Zeit benötigt, um zu serialisieren eines basic Typ byte-array. Ich habe es für den Fall, wenn Sie bereits über ein array und offset-wo wollen Sie Ihre Daten. Ich denke, das ist wirklich ein wichtiger Fall im Vergleich zu den theoretischen Holen Sie sich ein array mit 4 bytes, weil beim serialisieren etwas, dann ist es genau das, was Sie brauchen. Ich habe herausgefunden, dass die Antwort auf welche Methode schneller ist, hängt davon ab, welche Art Sie serialisieren möchten. Ich habe versucht einige Methoden:
m_Bytes[offset] = (byte)(value >> 8)
m_Bytes[offset] = (byte)((i >> 8) & 0xFF)
Lief ich alle test-10 Mio mal. Unten sind die Ergebnisse in Millisekunden
Wie Sie sehen können der unsichere Weg ist, viel schneller für long und double (unsigned-Versionen sind ungefähr das gleiche wie Ihre unterschriebene Versionen, so dass Sie sind nicht in der Tabelle). Für short/int/float der Schnellste Weg ist die 2/4/4 Aufgaben mit shift. Für byte, der Schnellste ist natürlich das einfache Zuweisung. Also in Bezug auf die ursprüngliche Frage - die Zuordnung Weg ist der beste. Dies ist das Beispiel einer solchen Funktion in einem Schnellste Weg:
P. S. Die tests wurden ausgeführt, die auf x64-Umgebung mit code kompiliert, um jede cpu (x64 am laufen) im release-Modus.
InformationsquelleAutor der Antwort Ilya Chernomordik
Der Schnellste Weg ist mit ein struct mit 4 bytes.
Deutlich schneller als die BitConverter.
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx
verfügt über die erforderlichen Attribut.
InformationsquelleAutor der Antwort TomTom
Hinweis: die BitConverter vielleicht nicht die Schnellste, wie der test unten zeigt.
Verwenden Sie die
BitConverter
Klasse, speziell dieGetBytes
- Methode, die einenInt32
parameter:Können Sie
BitConverter.IsLittlEndian
um zu bestimmen, die byte-Reihenfolge, basierend auf der CPU-Architektur.EDIT: Der test unten ist nicht schlüssig, aufgrund von compiler-Optimierungen.
InformationsquelleAutor der Antwort George Duckett
Als viele hier scheinen zu streiten, wenn
BitConverter
ist beter als ein dedizierterstruct
. Basierend auf BCL-source-code derBitConverter.GetBytes()
sieht wie folgt aus:Welche aus meiner Sicht ist mehr sauber und scheint schneller als 1 integer + 4 byte Zuordnung zu einer expliziten Struktur wie dieses.
InformationsquelleAutor der Antwort fiinix
Durchschnittlich rund 2770ms auf meinem Rechner während
Durchschnittlich rund 4510ms.
InformationsquelleAutor der Antwort Jon Hanna
Ich denke, das könnte der Schnellste Weg, in C#.. (mit byte-array initialisiert 4x int stream w/int32
InformationsquelleAutor der Antwort JGU