다음 질문이 있습니다. 나는 값과 참고에 의해 할당을 시도하고 명시된 바와 같이 here 할당 ba 값은 빠를 것이지만 내 코드를 시도 할 때 때로는 assign1이 더 빠르거나 때로는 assign2처럼 혼합 된 결과를 주었다.속도 참조 대 값
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
}
};
주 :
for(int i=0;i<10;i++){
{
MyAddress a1(1);
MyAddress a2(2);
MyAddress a3(3);
clock_t tstart=std::clock();
a1.assign1(a2);
a1.assign1(a3);
clock_t tend=std::clock();
float time_elapsed=((float)tend-(float)tstart);
std::cout<<std::fixed<<"\nassign1 time elapsed : "<<time_elapsed/CLOCKS_PER_SEC;
}
{
MyAddress a1(1);
MyAddress a2(2);
MyAddress a3(3);
clock_t tstart=std::clock();
a1.assign2(a2);
a1.assign2(a3);
clock_t tend=std::clock();
float time_elapsed=((float)tend-(float)tstart);
std::cout<<"\nassign2 time elapsed : "<<time_elapsed/CLOCKS_PER_SEC;
}
std::cout<<std::endl;
}
ASSIGN1 시간 경과 : 0.093000 ASSIGN2 시간 경과 : 0.094000
ASSIGN1 시간이 경과 : 0.095000 ASSIGN2 시간이 경과 : 0.092000
ASSIGN1 시간이 경과 : 0.109000 할당 2 시간 경과 : 0.093000
ASSIGN1 시간 경과 : 0.099000 ASSIGN2 시간 경과 : 0.094000
ASSIGN1 시간이 경과 : 0.099000 ASSIGN2 시간이 경과 : 0.101000
ASSIGN1 시간이 경과 : 0.096000 ASSIGN2 시간이 경과 : 0.120000
ASSIGN1 시간 경과 시간 : 0.098000 할당 2 시간 : 0.105000
assign1 시간 경과 : 0.113000 ASSIGN2 시간이 경과 : 0.108000
ASSIGN1 시간이 경과 : 0.111000 ASSIGN2 시간이 경과 : 0.103000
ASSIGN1 시간이 경과 : 0.106000 ASSIGN2 시간이 경과 :
0.106000 내가 테스트 코드의 일부를 변경했다 : 지금 나는 1000의 반복을 10 대신에 수행한다. 결과가 여전히 혼합되어있다 : 나를 위해 특별히 이상한 것은 때로는 처음에는 더 빠르지 만 때로는 더 빠르다는 것이다.
1)
assign1 time elapsed : 111.228996
assign2 time elapsed : 112.097000
2)
assign1 time elapsed : 127.087997
assign2 time elapsed : 126.691002
어떻게 설명하나요? 내 경우에는 결과가이 경우 값 또는 참조 메소드와 독립적 인 것처럼 보입니다.
마지막
나는 이것이 내가 이해한다면 방법은 here을 제안 생각 나는 이런 식으로 뭔가를 사용하고 그것을 올바른
MyAddress get_names(MyAddress& ref){return ref;}
지금 ASSIGN2에 이런 식으로 이루어집니다 :
a1.assign2(get_names(a2));
a1.assign2(get_names(a3));
을
실제로 할당량은 성능이 약간 씩 향상됩니다. 적어도 매번 변경 될 수 있습니다. 그러나 이것이 제가보기로되어있는 차이입니까?마지막으로
assign1 time elapsed : 127.087997
assign2 time elapsed : 126.691002
assign1 time elapsed : 137.634995
assign2 time elapsed : 136.054993
: 일반적인 경우에 대한
assign1 time elapsed : 1404.224976
assign2 time elapsed : 1395.886963
복사본을 원한다면 항상'assign2' 버전을 사용하십시오. 때로는 더 최적화 할 수 있습니다. 최적화가 활성화 된 바보 같은 벤치 마크를하고 있습니까? –
[원하는 속도? 값으로 전달] (http://cpp-next.com/archive/2009/08/want-speed-pass-byvalue/). –
@ cf16, 위의 링크를 읽어야합니다. 언제 어디서 더 빠를지를 설명합니다. 발생할 수있는 최적화를 설명하는 또 다른 접근 방법은 [여기] (http://definedbehavior.blogspot.com/2011/08/value-semantics-copy-elision.html)를 참조하십시오. 마지막으로, C++ 11에서는 컴파일러 최적화에 의존하지 않도록 * 이동 * 연산 (생성자/할당)을 제공 할 수 있습니다. –