Nella nostra applicazione, abbiamo un array di byte molto grande e dobbiamo convertire questi byte in tipi diversi. Attualmente, usiamo BitConverter.ToXXXX()
per questo scopo. I nostri colpitori pesanti sono, ToInt16
e ToUInt64
.Cast veloce in C# usando BitConverter, può essere più veloce?
Per UInt64
, il nostro problema è che il flusso di dati ha effettivamente 6 byte di dati per rappresentare un intero grande. Poiché non v'è alcuna funzione nativa per convertire 6-byte di dati per UInt64
, facciamo:
UInt64 value = BitConverter.ToUInt64() & 0x0000ffffffffffff;
Il nostro uso di ToInt16
è più semplice, non c'è bisogno di fare qualsiasi manipolazione bit.
Facciamo così tante di queste 2 operazioni che volevo chiedere alla comunità SO se c'è un modo più veloce per fare queste conversioni. In questo momento, circa il 20% di tutti i nostri cicli di CPU viene consumato da queste due funzioni.
Le prestazioni intere non sono probabilmente il tuo problema. L'elaborazione di array di grandi dimensioni fa quasi sempre rallentare il rallentamento della RAM bus. Presta attenzione al contatore delle prestazioni "Last Level Cache Misses" nell'output del tuo profiler. –
@Hans: hai sicuramente ragione: siamo legati alla memoria. Ma per quello, non so cosa fare. Abbiamo un grande array e dobbiamo attraversare ogni byte per estrarre i dati. Mentre procedo linearmente nell'array, il prefetcher dell'hardware si blocca probabilmente nel pattern di accesso e al di là di questo, non so che altro si possa fare. --thanks – SomethingBetter