Duff's Device
2016-03-18 本文已影响884人
bingoc
所谓的Duff's Device其实只是一种代码的特殊写法,他将switch和do...while结合起来使得算法效率变高,先上代码:
int duffs_device(char *from, char *to, int count)
{
{
int n = (count + 7) / 8;//计算循环次数
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);
}
}
return count;
}
这样写法的好处很明显,只使用了一次switch,而while的判断次数减少了8倍,至于为什么是8,我也不知道。如果有大牛可以为我解惑就最好啦。
还有另外一种写法:
int zeds_device(char *from, char *to, int count)
{
{
int n = (count + 7) / 8;
switch (count % 8){
case 0:
again: *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++;
if(--n > 0)
goto again;
}
}
return count;
}
但是一般都不建议用这一类写法,因为很难理解为什么要这么写,而且switch中没有break,显得相当不规范。
看到这个我曾经想过如果我们用遍历char*到'\0'来求长度,那我们干嘛不一次多++几次,那效率不是提高很多么。好吧,就是开个玩笑。。
看到判断,我记得系统在处理判断的时候会有个预期值,比如上一次判断为true,在这次循环时会优先考虑true的情况。举个例子。
int a[] = {1,1,1,1,1,1,1.....0,0,0,0,0,0};
int b[] = {1,0,1,0,1,0,1.....0,1,0,1,0,1};
while(a[i] == 1) {
i++;
}
while(b[i] == 1) {
i++;
}
在遍历这两种数组时,a的效率要比b快。