Domanda

Ho una routine veloce a livello di bit che calcola un valore, e restituisce un UInt32. Ho bisogno di memorizzare questo valore in SQL Server in un campo int a 32 bit. Non voglio aumentare le dimensioni del campo, e voglio solo per memorizzare il "byte" da questa funzione il campo int.

Centinaia di questi documenti sono richiesti in un momento, quindi ho bisogno il modo più veloce per convertire un UInt32 a int in un ciclo. Se il bit più a sinistra si trova nel UInt32, dovrebbe impostare il bit di segno del int (o fare qualsiasi cosa "ripetibile", in realtà, ma il bit di segno sarebbe probabilmente più facile).

In altre parole, voglio solo i 4 byte di un UInt32 per diventare i 4 byte di un int a 32 bit. Potrei utilizzare la classe BitConverter, ma non sono sicuro che è il modo più veloce. Sarebbe più veloce per fare questo con una superficie incontrollato in questo modo:

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

Vedo la questione inversa è stato chiesto qui, e stavo chiedendo se la risposta sarebbe la stessa in senso contrario:

modo più veloce per getto int UInt32 bit per bit?

È stato utile?

Soluzione

direi che la versione incontrollato (come unchecked((int)x)) è il modo più veloce, poiché non c'è chiamata di metodo. Non credo ci sia un modo più veloce.

A proposito, UInt32 è solo un altro nome per uint ... andare in un modo è lo stesso di andare in un altro modo, in termini di prestazioni, quindi questo è davvero lo stesso del link che hai postato.


Edit: Mi ricordo di osservare di prima mano un'istanza di un punto di riferimento dove checked era più veloce di unchecked (e no, non era una build di debug, è stata una build di rilascio con le ottimizzazioni). Non so il motivo per cui quello che è successo, ma in ogni caso, non credo che otterrai qualcosa di misurabile girando di controllo di troppo pieno.

Altri suggerimenti

unchecked((int)x) è necessaria solo const colata e controllato e incontrollato produce gli stessi risultati (se il codice può compilare).

Per esempio, questo codice

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

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

produce questo output

4292515959
-2451337
-2451337

Per essere più concisi, questo codice può essere compilato (stesso risultato di unchecked((int)data))

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

Questo codice (notare il const) non può essere compilato (richiede incontrollato)

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

Questo codice non può essere compilato così (richiede incontrollato)

checkedData = (int)4292515959;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top