性能提高(2) 优化循环的要注意的4个细节

来源:互联网 发布:四川长虹和人工智能 编辑:程序博客网 时间:2024/06/06 01:02

 

适合初中级朋友

 

(1)   注意CPU0寄存器

CPU里有个用于存放0的寄存器

在做比较时if,和0比较的话,在汇编上会比0以外的值少一条汇编指令

在循环里用到就能提高效率

int end = max -1;

for(i = 0; i < end; i++) {

 

}

 

优化为:

int end = max -1;

for(i = end; i > 0; i--) {

 

}

同理while(i<end)也能类似方法优化

 

(2)   for循环判断条件里别用赋值语句

for(i = 0; i < (max – 1); i++) {

 

}

优化为:

int end = max -1;

for(i = 0; i < end; i++) {

 

}

 

(3)   能在循环外作的尽量在循环外做

看下面例子:

for() {

a += (b + (c/2));

}

 

可以把赋值放在循环体外,优化为:

 

tmp = c/2;

for() {

a += (b + tmp);

}

 

(4)   对递归或知道指定结果的,可直接指定常数返回

这个不好理解点,先看个例子:

 

 

int recursive (int n) {

    if (!n) {

        /* if n==0 return 1 directly */

        return 1;

    }

 

    /*递归*/

    unsigned long tmp = 1;

    for (unsigned long i = 1; i <= n; tmp *= i++)

        ;

    return tmp;

}

比如,我实际调用recursive (int n)时,用调试工具跟踪得知,

调用递归(int n)时,输入参数n值很大几率(80%)为0123这几个值,

这样的情况,就可以做如下优化:

 

int recursive(int n) {

 

    unsigned long tmp = 1;

 

    switch(n) {

        case 0:

        case 1:

            break;

        case 2:

            tmp = 2;

            break;

        case 3:

            tmp = 6;

            break;

        default :

            {

            /*递归*/

            for (unsigned long i = 1; i <= n; tmp *= i++)

                ;

            return tmp;

            }

    }

 

    return tmp;

 

后记:

最近一直做性能优化的工作,想把学到一些东西拿出来和大家分享下,

免得大家走了弯路,以后发现新的优化方法,我会陆续补充,

文中有错误疏漏望不吝指教,呵呵

 

原创粉丝点击