今天看到了一个Duff's device另类的算法设计,代码如下:
void send( int * to, int * from, int count){
今天看到了一个Duff's device另类的算法设计,代码如下:
void send( int * to, int * from, int count){
register n = (count + 7) / 8; /* count > 0assumed */
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);
}
}
刚开始看了半天也没搞清楚这段代码是怎么执行的,就上网查了查也没搞很明白,于是就写了一小代码测试了下,总算是弄明白了。这段程序的主体是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 ( int i = 0 ; i != count; ++ i)
{
* to ++ = * from ++ ;
}
}
这段代码的确很简单,也能正确执行,但是却忽略了一个重要因素:执行效率。计算一下就可以知道,使用for语句函数里面的循环条件,即i和count的比较运算的次数,是Duff's device的8倍!在做整数赋值的工作时,赋值运算的耗时是非常小的相比之下比较运算工作耗时较大是会大大地影响函数整体的效率的。Duff's device则是一种非常巧妙的解决办法,而且如果把8换成更大的数的话,效率提高会更多!