b'\n_START_ARTICLE_\nMechanizm Duffa\n_START_PARAGRAPH_\nMechanizm Duffa - w informatyce jest zoptymalizowan\xc4\x85 wersj\xc4\x85 kopiowania jednej tablicy do drugiej. U\xc5\xbcywa do tego metody szeroko stosowanej w assemblerze polegaj\xc4\x85cej na odwijaniu p\xc4\x99tli. Wynalezienie tej metody dla j\xc4\x99zyka C jest przypisywane Tomowi Duffowi (listopad 1983). W praktyce jednak stosowanie tej metody przy tworzeniu program\xc3\xb3w nie jest konieczne, poniewa\xc5\xbc wi\xc4\x99kszo\xc5\x9b\xc4\x87 wsp\xc3\xb3\xc5\x82czesnych kompilator\xc3\xb3w sama optymalizuje kod w ten spos\xc3\xb3b.\n_START_SECTION_\nDzia\xc5\x82anie\n_START_PARAGRAPH_\nPrzyk\xc5\x82ad prostego kopiowania dw\xc3\xb3ch tablic znakowych wykonuje test zako\xc5\x84czenia dzia\xc5\x82ania po przepisaniu ka\xc5\xbcdego elementu:_NEWLINE_void kopiuj(char *wej, char *wyj, int krotnosc) {_NEWLINE_    while (krotnosc-- > 0)    {_NEWLINE_        *wyj++ = *wej++;    _NEWLINE_    }}_NEWLINE_Mechanizm Duffa pozwala wyeliminowa\xc4\x87 du\xc5\xbc\xc4\x85 cz\xc4\x99\xc5\x9b\xc4\x87 niepotrzebnych sprawdze\xc5\x84:_NEWLINE_void kopiuj(char *wej, char *wyj, int krotnosc){_NEWLINE_    int n = (krotnosc + 7) / 8;_NEWLINE_    switch (krotnosc % 8) {_NEWLINE_      case 0: do { *wyj++ = *wej++;_NEWLINE_      case 7:      *wyj++ = *wej++;_NEWLINE_      case 6:      *wyj++ = *wej++;_NEWLINE_      case 5:      *wyj++ = *wej++;_NEWLINE_      case 4:      *wyj++ = *wej++;_NEWLINE_      case 3:      *wyj++ = *wej++;_NEWLINE_      case 2:      *wyj++ = *wej++;_NEWLINE_      case 1:      *wyj++ = *wej++;_NEWLINE_                 } while (--n > 0);_NEWLINE_    }}\n_START_SECTION_\nOpis\n_START_PARAGRAPH_\nZapis metody mo\xc5\xbce by\xc4\x87 myl\xc4\x85cy, jednak program dzia\xc5\x82a tak, jak gdyby p\xc4\x99tla do\xe2\x80\xa6while by\xc5\x82a ca\xc5\x82kowicie pod ca\xc5\x82ym switch, natomiast pod ka\xc5\xbcdym case by\xc5\x82oby polecenie skoku do odpowiedniego miejsca p\xc4\x99tli do\xe2\x80\xa6while. Inny rodzaj zapisu u\xc5\x82atwiaj\xc4\x85cy zrozumienie m\xc3\xb3g\xc5\x82by mie\xc4\x87 posta\xc4\x87:_NEWLINE_void kopiuj(char *wej, char *wyj, int krotnosc) {_NEWLINE_    int n = (krotnosc + 7) / 8;_NEWLINE_    switch (krotnosc % 8) {_NEWLINE_      case 0: goto miejsce0;_NEWLINE_      case 7: goto miejsce7;_NEWLINE_      case 6: goto miejsce6;_NEWLINE_      case 5: goto miejsce5;_NEWLINE_      case 4: goto miejsce4;_NEWLINE_      case 3: goto miejsce3;_NEWLINE_      case 2: goto miejsce2;_NEWLINE_      case 1: goto miejsce1;_NEWLINE_    }miejsce0: do { *wyj++ = *wej++;miejsce7: *wyj++ = *wej++;miejsce6: *wyj++ = *wej++;miejsce5: *wyj++ = *wej++;miejsce4: *wyj++ = *wej++;miejsce3: *wyj++ = *wej++;miejsce2: *wyj++ = *wej++;miejsce1: *wyj++ = *wej++;_NEWLINE_              } while (--n > 0);}_NEWLINE_Instrukcja przypisania *wyj++ = *wej++ musi by\xc4\x87 wykonana krotnosc razy. P\xc4\x99tla do zawiera 8 kopiowa\xc5\x84. Dlatego nale\xc5\xbcy obliczy\xc4\x87 ile razy krotnosc dzieli si\xc4\x99 przez 8 \xe2\x80\x93 w\xc5\x82a\xc5\x9bnie tyle razy nale\xc5\xbcy wykona\xc4\x87 do. Natomiast reszta z dzielenia to liczba dodatkowych kopii, dlatego nast\xc4\x99puje skok pod odpowiednie miejsca, spod kt\xc3\xb3rego wykona si\xc4\x99 tyle kopiowa\xc5\x84, ile wynios\xc5\x82a reszta z dzielenia. Po tym zostanie sprawdzony warunek while (--n > 0) i ewentualny skok do pocz\xc4\x85tku do i wykonanie pozosta\xc5\x82ych kopii. Dodanie do krotnosc siedmiu pochodzi z oryginalnego rozwi\xc4\x85zania, mo\xc5\xbcliwe jest wyeliminowanie tego dodania przy odpowiedniej modyfikacji etykiet skok\xc3\xb3w.'