register n =
(count +7)
/8; /* count > 0assumed */
switch(count%8)while
(--n >0)
;
}
}剛開始看了半天也沒搞清楚這段**是怎麼執行的,就上網查了查也沒搞很明白,於是就寫了一小**測試了下,總算是弄明白了。這段程式的主體是do while而非switch case,理解這一點剩下就比較很好理解了。首先程式順序執行進入switch case條件判斷,根據count %
8的值直接跳轉到相應case語句後執行,此時程式跳轉到dowhile迴圈體內,接下來的程式就一直在do while迴圈體內執行,直到條件不滿足。也就是說switch case在執行一次後就失去了作用(這時候由於已經沒有了
switch
,所以後面的標號就變成普通標號了,程式就會忽略掉這些標號)。
上面的**也可用for語句實現,**如下:
void my_send( int * to, int * from, int count) }
這段**的確很簡單,也能正確執行,但是卻忽略了乙個重要因素:執行效率。計算一下就可以知
道,使用
for語句函式裡面的迴圈條件,即i和
count
的比較運算的次數,是duff's device的
8倍!在做整數賦值的工作時,賦值運算的耗時是非常小的相比之下比較運算工作耗時較大是會大大地影響函式整體的效率的。duff's device則是一種非常巧妙的解決辦法,而且如果把
8換成更大的數的
話,效率提高會更多!
Duff s Device 達夫裝置
這是個很棒的迂迴迴圈展開法,由 tom duff 在 lucasfilm 時所設計。它的 傳統 形態,是用來複製多個位元組 register n count 7 8 count 0 assumed switch count 8 while n 0 這裡 count 個位元組從 from 指向的陣列複...
達夫裝置 Duff s Device
今天遇到乙個非常詭異的 不多說直接上 void duffdev char to,char from,int count while n 0 void normalcopy char to,char from,int count while count 0 我第一眼看到這個 很懵。不知道是什麼意思。s...
達夫裝置(Duff s Device)
達夫裝置裝置是一段非常巧妙,看起來非常詭異的c 它可以很大的提高程式執行的效率 本文將試驗 達夫裝置的 我就不說了,我們來分析一下。達夫裝置是考慮到我們一般用for或者while迴圈的時候,如果執行迴圈內容本身用不了多少時間,那麼時間將被主要消耗在每次迴圈的比較語句上邊。事實上比較語句是有很大優化空...