for (i = 10 ; i-- > 0 ;)
result_array[i] = byte_array[i] & byte_mask[i];
- Yendo hacia atrás precarga del procesador de caché líneas.
- Incluir la disminución en la comparación puede guardar algunas instrucciones.
Esto funcionará para todas las matrices y procesadores. Sin embargo, si sabe que sus matrices están alineadas con palabras, un método más rápido es convertir a un tipo más grande y hacer el mismo cálculo. Por ejemplo, digamos n=16
en lugar de n=10
. Entonces esto sería mucho más rápido:
uint32_t* input32 = (uint32_t*)byte_array;
uint32_t* mask32 = (uint32_t*)byte_mask;
uint32_t* result32 = (uint32_t*)result_array;
for (i = 4 ; i-- > 0 ;)
result32[i] = input32[i] & mask32[i];
(Por supuesto que necesitan un tipo adecuado para uint32_t
, y si n
no es una potencia de 2 que necesita para limpiar el inicio y/o fin para que el 32- bit cosas está alineado.)
Variación: La pregunta específicamente requiere que los resultados se coloquen en una matriz separada, sin embargo, sería casi seguro que sería más rápido modificar la matriz de entrada en contexto.
Espera, ¿el precaptor de caché funciona mejor a la inversa? Pensé que solo se anticipaba yendo hacia adelante. – Crashworks
Preocuparse por la precarga de las líneas de caché del procesador parece una optimización prematura severa. – Trent
@Trent - el * punto * de la pregunta es optimización. También ir hacia atrás no es más lento, por lo que también podría. @Crashworks: recuerde que las líneas de caché están alineadas, por lo general en límites masivos, por lo que normalmente tiene que extraer bytes antes de los que está solicitando. –