c / expert
Snippet
Duff's Device für manuelles Loop Unrolling
Duff's Device ist ein berühmtes C-Idiom, das das Fall-Through-Verhalten einer Switch-Anweisung nutzt, um in die Mitte einer Schleife zu springen. Es führt ein manuelles Loop Unrolling durch, was die Anzahl der Sprungbefehle reduziert und die Performance bei Massendatentransfers verbessert.
snippet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void fast_copy(int *to, int *from, int count) {int n = (count + 7) / 8;switch (count % 8) {case 0: do { *to++ = *from++;case 7: *to++ = *from++;case 6: *to++ = *from++;case 5: *to++ = *from++;case 4: *to++ = *from++;case 3: *to++ = *from++;case 2: *to++ = *from++;case 1: *to++ = *from++;} while (--n > 0);}}
Erklärung
1
int n = (count + 7) / 8;
Berechnet, wie oft der ungerollte Schleifenkörper (8 Operationen) ausgeführt werden soll.
2
switch (count % 8) {
Bestimmt den Einstiegspunkt in die Schleife, um zuerst die verbleibenden Elemente zu verarbeiten.
3
case 0: do { *to++ = *from++;
Das Schlüsselwort 'do' markiert den Beginn der Schleife, die an jedem 'case'-Label betreten werden kann.