注册 登录
编程论坛 C++教室

新手请教,语句的效率问题!

ssikkiss 发布于 2010-06-13 21:06, 980 次点击
一直想问问,像下面的代码,怎样写更快:

1.在写循环的时候,
a写法:
        for(int i=0;i<text.length();i++){}
b写法:
        int len=text.length();
        for(int i=0;i<len;i++){}
请问a和b谁快?是一样吗?关键有时候text.length()会换成其他函数,比如一个执行的很慢的函数,是否每次比较的时候都会运算一次呢?

2.在写循环的时候,
a写法:
    while(i>0){
        ......
        int k=2;
        ......
    }
b写法:
    int k=2;
    while(i>0){
        ......
        ......
    }
请问a和b谁快?对a,是不是循环体里每次循环,都要创建一个变量k,又删除这个变量,而比较慢?

3。对整数乘2的运算:
a写法:    k<<=1;
b写法:    k+=k;
c写法:    k*=2;
请问a,b,c哪种快?其速度与k的值有没有关系?

4.对相减求模的运算,(模p,p,x,y都是正整数)
a写法:
        x-=y;
        x+=p;
        x%=p;
b写法:
        x-=y;
        if(x<0){
            x+=p;
        }else if(x>0){
            x-=p;
        }
请问a和b谁快?



10 回复
#2
南国利剑2010-06-14 15:06
第一题,b的写法比较快。
因为b的写法只调用了一次函数,而a的写法调用了n次,
大家都知道,函数调用时有开销的
#3
南国利剑2010-06-14 15:07
第二题,不是很理解你的意思。
#4
南国利剑2010-06-14 15:09
第三题,我认为a的位运算的方法最快。
#5
南国利剑2010-06-14 15:11
第四题,也没看懂题目的意思。
#6
书呆2010-06-14 16:30
问题1: 两种写法效率没有区别,因为编译器处理时也是先算出结果然后保存在寄存器中。选择让代码更易读的写法。
问题2: 编译器优化会把循环中的不变量外提,所以两种写法在优化后是一样的。不过更推荐第二种写法。
问题3: 第一种写法效率较高。实际上,某些编译器会把b,c优化为第一种写法。
问题4: 没看懂

PS:如果你想提高程序效率,应该考虑在算法上的改进,而不是语句。
#7
华仔li2010-06-14 23:21
第一题肯定是b快啦
#8
ssikkiss2010-06-14 23:33
第4问是这样的:
就是我自定义了一个类型,名叫mod_int,
1:mod_int型的数总是正数
2:mod_int型的数小于一个素数p;
3:mod_int其实就是整数模p构成的有限域;

上面的第4问就是对这中mod_int型的数做减法;
请问应该用哪种方法写?
#9
ssikkiss2010-06-14 23:41
对第1问我还有点疑问:
假设这样:
for(int i=0;i<k;i++){
    k=....
}
或者这样:
int calc(){
    return k+2;
 }
for(int i=0;i<calc();i++){
    k=....
}

如果编译器保存了k的值的话,后面对k的修改就无效了吗?



#10
书呆2010-06-16 17:49
回复 9楼 ssikkiss
不是。循环优化是对循环不变量的。如果k是循环变量,它不会被优化。
#11
南国利剑2010-06-17 13:23
回复 6楼 书呆
我对尊驾的第一题的看法表示质疑。
现在即使你把一个变量定义为寄存器变量,编译系统也是伪处理而已,并没有把这个变量的空间真正的开辟在几个有限而宝贵的寄存器里头。
何况这里并没有定义寄存器变量。
而且可以肯定的是判断语句每次执行都调用一次函数。
所以二者的效率是有区别的。
1