2011-01-02 7 views
1

Ich habe eine schnelle Routine auf Bitebene, die einen Wert berechnet und ein UInt32 zurückgibt. Ich muss diesen Wert in SQL Server in einem 32-Bit-Int-Feld speichern. Ich möchte die Größe des Feldes nicht vergrößern und möchte nur die "Bytes" von dieser Funktion das int-Feld speichern.Schnellste Umwandlung von UInt32 nach int in C#

Hunderte dieser Datensätze werden gleichzeitig angefordert, daher brauche ich den schnellsten Weg, um ein UInt32 in eine Schleife in int zu konvertieren. Wenn das am weitesten links liegende Bit im UInt32 gesetzt wird, sollte es das Vorzeichenbit des int setzen (oder irgendetwas "wiederholbar" machen, wirklich, aber das Vorzeichenbit wäre wahrscheinlich am einfachsten).

Mit anderen Worten, ich möchte nur die 4 Bytes eines UInt32 zu den 4 Bytes eines 32-Bit-Int. Ich könnte die BitConverter-Klasse verwenden, aber ich bin mir nicht sicher, ob das der schnellste Weg ist. Wäre es schneller sein, dies wie dies mit einem ungeprüften Bereich zu tun:

UInt32 fld = 4292515959; 
unchecked { 
    return (int)fld; 
    // -2451337 
} 

Ich sehe die umgekehrte Frage hier gefragt wurde, und habe mich nur gefragt, ob die Antwort das gleiche geht die andere Weise sein würde:

+0

Es ist das gleiche, Sie können sich C# als C mit Sicherheitschecks vorstellen. Wenn Sie also unsigned int in int schreiben möchten, verwenden Sie einfach Typcasting. Aber schließe es zuerst mit unchecked ein und signalisiere dem Compiler, deine Absicht nicht zu überprüfen. Andernfalls würde der Compiler dir einen Fehler melden, dass die Zuweisung nicht kompatibel ist, durch Inkompatibilität bedeutet es, dass die Genauigkeit des Wertes in der Übersetzung verloren gehen könnte (zB 4292515959 ist nicht mehr dasselbe, wird negativ 2451337 (sie sind in der Perspektive eines Informatikers gleich [xkcd 541])) –

+0

Danke Michael. Wenn Sie dies nicht zu einem Kommentar gemacht hätten, hätte ich dies sofort als Antwort gewählt. – Flipster

Antwort

3

Ich würde sagen, dass die ungeprüfte Version (wie unchecked((int)x)) der schnellste Weg ist, da es keinen Methodenaufruf gibt. Ich glaube nicht, dass es einen schnelleren Weg gibt.

By the way, UInt32 ist nur ein anderer Name für uint ... geht ein Weg ist, die gleiche wie eine andere Art und Weise in Bezug auf die Leistung geht, so ist dies wirklich der gleiche wie der Link Sie auf dem Laufenden.


Edit: Ich erinnere mich aus erster Hand eine Instanz einer Benchmark zu beobachten, wo checked war schneller als unchecked (und nein, es war kein Debug-Build, es war ein Release mit Optimierungen bauen). Ich weiß nicht, warum das passiert ist, aber denke in jedem Fall, dass du durch das Umdrehen der Überlaufprüfung nichts messbares gewinnen wirst.

+0

Danke Lambert. Nur die Beruhigung, die ich brauchte. – Flipster