for (i = 10 ; i-- > 0 ;)
result_array[i] = byte_array[i] & byte_mask[i];
- rückwärts vorge Lasten Prozessor-Cache-Linien.
- Mit dem Dekrement im Vergleich können einige Anweisungen gespeichert werden.
Dies funktioniert für alle Arrays und Prozessoren. Wenn Sie jedoch wissen, dass Ihre Arrays wortorientiert sind, besteht eine schnellere Methode darin, in einen größeren Typ zu konvertieren und die gleiche Berechnung durchzuführen.
Zum Beispiel sagen wir n=16
anstelle von n=10
. Dann wäre dies viel schneller sein:
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];
(Natürlich kann man einen richtigen Typen für uint32_t
benötigen, und wenn n
keine Potenz von 2 Sie müssen den Anfang, um aufzuzuräumen und/oder endet, so dass die 32- Bit-Zeug ist ausgerichtet.)
Variation: Die Frage fordert speziell für die Ergebnisse in einem separaten Array platziert werden, aber es wäre fast sicher schneller das Eingangs-Array in-Place zu ändern.
Warte, arbeitet der Cache-Prefetcher besser rückwärts? Ich dachte, es würde nur vorwärts gehen. – Crashworks
Die Sorge über das Vorladen von Prozessor-Cache-Zeilen scheint eine schwere vorzeitige Optimierung zu sein. – Trent
@Trent - der * Punkt * der Frage ist Optimierung. Auch rückwärts gehen ist nicht langsamer, also könnte es genauso gut sein. @Crashworks - denken Sie daran, dass Cache-Zeilen ausgerichtet sind, typischerweise an massiven Grenzen, so dass es in der Regel Bytes in Bytes vor denen, die Sie fordern, ziehen muss. –