for (i = 10 ; i-- > 0 ;)
result_array[i] = byte_array[i] & byte_mask[i];
- A ritroso precarica processore cache-linee.
- Includendo il decremento nel confronto è possibile salvare alcune istruzioni.
Questo funzionerà per tutti gli array e processori. Tuttavia, se sai che i tuoi array sono allineati alle parole, un metodo più veloce è quello di trasmettere a un tipo più grande e fare lo stesso calcolo.
Ad esempio, supponiamo n=16
anziché n=10
. Allora questo sarebbe molto più veloce:
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];
(naturalmente è necessario un tipo adatto uint32_t
, e se n
non è una potenza di 2 è necessario ripulire l'inizio e/o fine in modo che il 32- bit bit è allineato.)
Variazione: la domanda richiede specificamente che i risultati vengano posizionati in un array separato, tuttavia sarebbe quasi certamente più rapido modificare l'array di input sul posto.
fonte
2009-03-20 22:53:38
Aspetta, il prefetcher della cache funziona meglio al contrario? Pensavo che fosse prefissato solo andando avanti. – Crashworks
Preoccuparsi del precaricamento delle linee della cache del processore sembra una severa ottimizzazione prematura. – Trent
@Trent - il * punto * della domanda è l'ottimizzazione. Anche andare all'indietro non è più lento, quindi potresti anche farlo. @Crashworks: ricorda che le linee della cache sono allineate, in genere su enormi limiti, quindi in genere deve inserire byte prima di quelli che stai richiedendo. –