Homepage of Jun LANG
Living without an aim is like sailing without a compass.

C++ Optimization Skills

Return

Little Skills

注意CPU的0寄存器

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)也能类似方法优化

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

for(i = 0; i < (max – 1); i++) {
优化为:
int end = max -1;
for(i = 0; i < end; i++) {}

 能在循环外作的尽量在循环外做

看下面例子:
for() {
	a += (b + (c/2));
}
可以把赋值放在循环体外,优化为:
tmp = c/2;
for() {
	a += (b + tmp);
}

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

这个不好理解点,先看个例子:
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%)为0,1,2,3这几个值,
这样的情况,就可以做如下优化:
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;
}

Last modified: 四 1 16 11:44:51 2014


Lang Jun © 2010-2016  Generate by Vim & VimWiki