2012-05-19 3 views
3

다음 질문이 있습니다. 나는 값과 참고에 의해 할당을 시도하고 명시된 바와 같이 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 
+0

복사본을 원한다면 항상'assign2' 버전을 사용하십시오. 때로는 더 최적화 할 수 있습니다. 최적화가 활성화 된 바보 같은 벤치 마크를하고 있습니까? –

+2

[원하는 속도? 값으로 전달] (http://cpp-next.com/archive/2009/08/want-speed-pass-byvalue/). –

+0

@ cf16, 위의 링크를 읽어야합니다. 언제 어디서 더 빠를지를 설명합니다. 발생할 수있는 최적화를 설명하는 또 다른 접근 방법은 [여기] (http://definedbehavior.blogspot.com/2011/08/value-semantics-copy-elision.html)를 참조하십시오. 마지막으로, C++ 11에서는 컴파일러 최적화에 의존하지 않도록 * 이동 * 연산 (생성자/할당)을 제공 할 수 있습니다. –

답변

6

할당 기능은 기본적으로 동일합니다. 하나는 임시 사용자를 복사 구성하고 다른 하나는 컴파일러가 자동으로 복사를 삽입하는 것입니다.

또한 10은 테스트에 큰 요인이 아닙니다.

+0

'assign2'가 더 잘 최적화 될 수 있다는 점을 제외하면. 'a1.assign2 (some_function())'는 인자를 불필요하게 복사하는 것을 피할 수 있습니다 (반환 값 최적화, 복사 elion 또는 호출하고자하는 것이 무엇이든). –

+0

예 @ K-ballo, 이것이 차이점입니다. – 4pie0

1

, 가치에 의하여 참조로
할당해야 거의 항상 능가 할당.

이유 : 참조로

  1. 할당
  2. 그것은 수있다 새로운 변수

상기 오버 구 변수의 값을 복사 할 필요가 없다 스택에 새로운 공간을 만들지 않기 대부분의 프로그램에서 중요하지 않습니다. 그러나 const 및 참조는 일반적인 프로그래밍 방법입니다.

현재 프로그램에서
두 구성이 동일하게 수행됩니다. 많은 수의 반복 프로그램을 사용하여 타이밍의 차이를 확인하십시오.

+0

부적절합니다. 두 함수 모두 복사본을 만듭니다. –

+0

참조에 의한 지정은 더 빠를 수 있지만, 새로운 복사본을 생성하고 그것을 수행하는 기본 방법 인 'swap'에 의해 할당 할 때가 아닙니다. 왜냐하면 강력한 예외 안전성을 얻는 것이 가장 쉬운 관용어이기 때문입니다. –