Bookmark : Duff’s Device

A Optimized memory to memory copy method : Duff’s Device

it can reduce brancn overhead for Modern CPU

Typical Version

do {                          /* count > 0 assumed */
    *to = *from++;              /* Note that the ''to'' pointer is NOT incremented */
  } while (--count > 0);      // need compare and brancn each all
Original Duff's Device Version:
switch (count % 8)  /* count > 0 assumed */
  {
    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 ((count -= 8) > 0);
  }
上面的寫法最特別的是將 do {} while 寫在 switch case 之中
一般是將其分開處理寫法是
for ( i = 0; i < count/8; i++)
for ( i = 0; i < count%8; i++)
這樣不知道算不算奇技?
 
Ref.
http://en.wikipedia.org/wiki/Duff%27s_device
http://www.lysator.liu.se/c/duffs-device.html
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: