En nuestra aplicación, tenemos una matriz de bytes muy grande y tenemos que convertir estos bytes en diferentes tipos. Actualmente, usamos BitConverter.ToXXXX()
para este propósito. Nuestros grandes bateadores son, ToInt16
y ToUInt64
.Fundición rápida en C# usando BitConverter, ¿puede ser más rápido?
Para UInt64
, nuestro problema es que la secuencia de datos tiene realmente 6 bytes de datos para representar un número entero grande. Puesto que no hay función nativa para convertir 6-bytes de datos a UInt64
, tenemos:
UInt64 value = BitConverter.ToUInt64() & 0x0000ffffffffffff;
Nuestro uso de ToInt16
es más simple, no tiene que hacer ningún tipo de manipulación de bits.
Hacemos tantas de estas 2 operaciones que quería preguntarle a la comunidad SO si hay una forma más rápida de realizar estas conversiones. En este momento, estas dos funciones consumen aproximadamente el 20% de nuestros ciclos completos de CPU.
El rendimiento entero no es probable que sea su problema. Procesar arreglos grandes casi siempre hace que el lento bus RAM sea el cuello de botella. Preste atención al contador de rendimiento "Falta el último nivel caché" en la salida de su generador de perfiles. –
@Hans: Definitivamente es correcto: estamos limitados por la memoria. Pero para eso, no sé qué hacer. Tenemos una gran matriz y debemos atravesar cada byte para extraer los datos. A medida que avance linealmente en la matriz, probablemente el prefetcher de hardware se ajuste al patrón de acceso y, más allá de eso, no sé qué más se puede hacer. --gracias al – SomethingBetter