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快。

上一篇下一篇

猜你喜欢

热点阅读