美文网首页
Duff's Device

Duff's Device

作者: bingoc | 来源:发表于2016-03-18 15:51 被阅读884次

    所谓的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快。

    相关文章

      网友评论

          本文标题:Duff's Device

          本文链接:https://www.haomeiwen.com/subject/vveflttx.html