【发布时间】:2012-05-27 08:58:00
【问题描述】:
我想测试C++中值传递和引用传递的速度:
class MyAddress{
char *name;
long int number;
char *street;
char *town;
char state[2];
long zip;
std::vector<int> v_int;
public:
MyAddress(int i){
v_int.resize(1000000);
std::fill(v_int.begin(),v_int.end(),i);
}
MyAddress& assign1(MyAddress const& x)
{
MyAddress tmp(x); // copy construction of tmp does the hard work
std::swap(*this, tmp); // trade our resources for tmp's
return *this; // our (old) resources get destroyed with tmp
}
MyAddress& assign2(MyAddress x)//x is a copy of the source
{ //hard work already done
std::swap(*this, x); // trade our resources for x's
return *this; // our (old) resources get destroyed with x
}
void f1(MyAddress v){int i=v.v_int[3];}
void f2(MyAddress const &ref){int i=ref.v_int[3];}
};
MyAddress get_names(MyAddress& ref){return ref;}
主要:
int _tmain(int argc, _TCHAR* argv[])
{
float time_elapsed1=0;
float time_elapsed2=0;
for(int i=0;i<100;i++){
{
MyAddress a1(1);
MyAddress a2(2);
MyAddress a3(3);
clock_t tstart=std::clock();
a1.f1(a2);
a1.f1(a3);
clock_t tend=std::clock();
time_elapsed1+=((float)tend-(float)tstart);
}
{
MyAddress a1(1);
MyAddress a2(2);
MyAddress a3(3);
clock_t tstart=std::clock();
a1.f2(a2);
a1.f2(a3);
clock_t tend=std::clock();
time_elapsed2+=((float)tend-(float)tstart);
}
}
std::cout<<std::fixed<<"\nassign1 time elapsed : "
<<time_elapsed1/CLOCKS_PER_SEC;
std::cout<<std::fixed<<"\nassign2 time elapsed : "
<<time_elapsed2/CLOCKS_PER_SEC;
system("pause");
return 0;
}
时差结果令人震惊:
assign1 已用时间:81.044998
assign2 已用时间:0.002000
这对吗?
“按价值”的速度怎么会比“按参考”高得多?
【问题讨论】:
-
你为什么用
std::vector,而不是std::string?现在你没有遵循 3/5/6/无论你想怎么称呼它的规则。无论如何,按值传递会调用昂贵的复制构造函数。 -
并不奇怪。复制 4MB 向量需要一些时间。
-
您没有在代码中的任何地方使用
assign1和assign2,但您在输出中提到了它们? -
我昨天实际上做了一些类似的测试。我花了大约 6 分钟将 1GB 的内存按值复制 100 次,但使用移动语义需要 78 毫秒。按值真的可以加起来。
-
@zch 说了什么。但是您仍然可能需要一台新机器 - 我得到的最慢运行(使用非优化编译)大约是 6 秒。
标签: c++ performance pass-by-reference pass-by-value