汗,函数传值效率这么低啊,大家来看看,是我的问题还是真的这么低
#include <iostream>
#include <time.h>
using namespace std;
int add(int a,int b);
void main()
{
clock_t begin,end;
int sum=0;
begin=clock();
for(int i=0;i<1000000;i++)
sum=add(1,2);
end=clock();
cout<<(end-begin)<<endl;
begin=clock();
for(int i=0;i<1000000;i++)
sum=1+*2;
end=clock();
cout<<(end-begin)<<endl;
system("pause");
}
int add(int a,int b)
{
return a+b;
}
输出结果:
38
3
效率差了10倍还多 真的假的
[解决办法]
因为你这个例子,函数呼叫成了主要的开销
你试试看把函数里面的操作弄得更复杂
差距就不会这么明显了
小小的优化
inline constexpr int add(int a,int b) //如果不支援constexpr的话,移走即可
{
return a+b;
}
[解决办法]
>constexpr加了报错
不支援就别加了
>constexpr是什么????
一个大幅简化template meta programming的好东西
http://www.cprogramming.com/c++11/c++11-compile-time-processing-with-constexpr.html
>只加inline时间居然是53差了17倍了,更多了。。。
你这是release版吗?哪一个编译器?
我用vc2010和mingw4.6.2的结果
release版都是0
或许你可以叫出assembly来看看?
[解决办法]
多执行几次,10%应该是 计时的误差。
[解决办法]
函数调用 需要保存上下文 当然会比直接计算要慢的
写成函数主要是为了代码的清晰 以及复用
lz如果对效率要求很高的话 可以直接用汇编
[解决办法]
还有
sum = 1 + 2;这条语句会被优化
你改成
int a = 1, b = 2;
sum = a+ b;再试试
[解决办法]
for(int i=0;i<1000000;i++)
sum=1+2;
上面这段,如果是release下,通常会被编译器优化成如下的形式:
sum += 3000000;
这样效率当然非常非常高的,因为for循环就没有调用
而循环体是add函数的问题,通常不复杂的函数,便宜器默认会给你展开成inline形式,
另外
clock函数的精度问题,因为习惯问题,我很少使用这个函数,但是我们可以知道它的精度是ms,通常VC在ms上的函数(通常)说是
[解决办法]
接上:
通常ms级别的函数,其精度非常地差。
甚至达到10ms的级别。
针对优化,
for()本身,如果确定for(int i=0; i<100000;i++)
如果计算于i关系不大,编译器通常也会给你优化成for(i=100000; i--;)的形式