» »

Duff's device

Duff's device

Gundolf ::

Upam da se boste tudi tisti ki ne marate C++a ;) znasli v tej kodi. Zadeva pac napolni tabelo elementov od 'begin' do 'end' z vrednostjo 'obj'. Zanima me ce ste ze kdaj slisali za ta t.i. Duff's device in kaj o njem menite.
template <class T> inline void FillDuff (T* begin, T* end, const T& obj) {
  switch ((end - begin) & 7)
  {
  case 0: 
    while (begin != end)
    {
      *begin = obj; ++begin;
  case 7: *begin = obj; ++begin;
  case 6: *begin = obj; ++begin;
  case 5: *begin = obj; ++begin;
  case 4: *begin = obj; ++begin;
  case 3: *begin = obj; ++begin;
  case 2: *begin = obj; ++begin;
  case 1: *begin = obj; ++begin;
    }
  }
}

Moj emnenje je, da je tole sicer dokaj ogaben a hkrati lep nacin za unwindanje zanke.

Vesoljc ::

lepota je itaq vprašljiva, ampak če dobiš performance ven, ji pač natakneš črno vrečo čez glavo in uživaš v rezultatu... 8-)

nekoč sem neki bral o tem duff-u, sam kake konkretne študije pa nisem naredu.

si naredu kak test? zanimivo bi bilo tudi videti kaj naredi prevajalnik...
Abnormal behavior of abnormal brain makes me normal...

Gundolf ::

Menda je uspesnsot zelo odvisna od prevajalnika (teste je zame naredil kar Alexandrescu 8-) ). V primerjavi s navadno for zanko je duff's device hitrejsi (10%-90%) v primeru ne prevelikega stevila elementov, ki jih fillas (ko te zacne bremzat RAM je vseeno kaksne finte delas procesorju). Razlika je se malo visja v primeru kopiranja bufferja in ne le filanja s konstanto.

Skoraj siguren sem, da bi morala biti razlika posebej ocitna pri izklopljenih optimizacijah. Zanimivo pa bi bilo sprobati zadevo v Javi. Skoda ker jo jaz tok ne maram (Jave), da se mi ne da niti tega poskusa narest;) .

Se za tiste ki niste uspeli ugotoviti kaj algoritem sploh delam je tu ekvivalentna a pocasnejsa koda :)
for (T* it = begin; it != end; ++it)
   *it = obj;


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

PL SQL problem

Oddelek: Programiranje
15918 (487) killa bee
»

vector::iterator problemi, brisanje podatkov iz vektorja

Oddelek: Programiranje
81121 (972) mn
»

Quick sort ascending/descending

Oddelek: Programiranje
162038 (1718) infiniteLoop
»

[c++] standardni c++ in dogodki(events)

Oddelek: Programiranje
121749 (1574) yeti
»

Šah [Pacsal]

Oddelek: Programiranje
152225 (1828) NeOman

Več podobnih tem