Frage

Ich habe eine schnelle Routine auf Bit-Ebene, die einen Wert berechnet und ein Uint32 zurückgibt. Ich muss diesen Wert in SQL Server in einem 32 -Bit -Feld speichern. Ich möchte die Größe des Feldes nicht erhöhen und nur die "Bytes" aus dieser Funktion des Int -Feldes speichern.

Hunderte dieser Aufzeichnungen werden gleichzeitig angefordert, daher brauche ich den schnellsten Weg, um ein Uint32 in eine Schleife in INT umzuwandeln. Wenn das links am meisten in der UINT32 eingestellt ist, sollte das Zeichen des INT festgelegt werden (oder alles "wiederholbar" tun, aber das Zeichenbit wäre wahrscheinlich am einfachsten).

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

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

Ich sehe, dass hier die umgekehrte Frage gestellt wurde, und habe mich nur gefragt, ob die Antwort gleich in die andere Richtung gehen würde:

Schnellster Weg, um INT in Uint32 bitweise zu werfen?

War es hilfreich?

Lösung

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

Übrigens, UInt32 ist nur ein anderer Name für uint... in eine Richtung ist der gleiche Weg wie die Leistung in Bezug auf die Leistung. Dies ist also wirklich der gleiche wie der Link, den Sie gepostet haben.


Bearbeiten: Ich erinnere mich, wie ich eine Instanz eines Benchmarks aus erster Hand beobachtet habe, wo checked war Schneller als unchecked (Und nein, es war kein Debug -Build, es war ein Veröffentlichungsgebäude mit Optimierungen). Ich weiß nicht, warum das passiert ist, aber auf jeden Fall glauben Sie nicht, dass Sie durch das Drehen der Überlaufprüfung etwas Messbares gewinnen werden.

Andere Tipps

unchecked((int)x) Es wird nur Gusskonstruktionen und überprüft und deaktiviert erforderlich, was die gleichen Ergebnisse erzielt (wenn der Code kompilieren kann).

Zum Beispiel dieser Code

uint data = 4292515959;
int uncheckedData;
int checkedData;
unchecked {
    uncheckedData = (int)data;
}
checkedData = (int)data;

Console.WriteLine(data);
Console.WriteLine(uncheckedData);
Console.WriteLine(checkedData);

erzeugt diese Ausgabe

4292515959
-2451337
-2451337

Um prägnanter zu sein, kann dieser Code kompiliert werden (gleiches Ergebnis wie unchecked((int)data))

uint data = 4292515959;
checkedData = (int)data;

Dieser Code (beachten Sie die const) kann nicht kompiliert werden (erfordert deaktiviert)

const uint data = 4292515959;
checkedData = (int)data;

Dieser Code kann auch nicht kompiliert werden (erfordert deaktiviert)

checkedData = (int)4292515959;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top