2017-10-16 5 views
-2

C++의 이동 및 테스트 의미를 비교 복사이동 의미 느리게 나는 작은 시험을 썼다

move 
copy 
lenVec = 10 : delta_t_copy/delta_t_move = 0.431172 
lenVec = 100 : delta_t_copy/delta_t_move = 0.257102 
lenVec = 1000 : delta_t_copy/delta_t_move = 0.166006 
lenVec = 10000 : delta_t_copy/delta_t_move = 0.108573 
lenVec = 100000 : delta_t_copy/delta_t_move = 0.113769 
lenVec = 1000000 : delta_t_copy/delta_t_move = 0.134912 
lenVec = 10000000 : delta_t_copy/delta_t_move = 0.133874 

내가 초기 벡터를 분할했다 크기 len의 3 개로. 길이 3의 첫 번째 부분, 길이 3의 중간 부분 및 나머지 부분의 크기 len-6. 결과는 복사 의미가 이동 의미보다 훨씬 빠르다는 것을 보여줍니다.

MSVC2015를 사용하고 있습니다.

그게 사실 일 수 있습니다. 이동 의미론은 어떤 상황에서 더 빠릅니까?

+0

블로그 게시물에 대한 링크가 아닌 [MCVE]를 (를) 게시하십시오. –

+0

아, 코드를 가로 질러 스크롤하는 것을 좋아합니다 ... – DeiDei

+2

그 외의 경우, "int"를 "이동"하고 있습니다. 그건 말이 안돼. – DeiDei

답변

1

Vittorio's answer 외에도 특별히 "move" 코드 패트에서 성능 저하를 일으키는 원인을 지적하겠습니다. 이것은 부분으로

vector<int> rightVec; 
move(startIt, endIt, std::back_inserter(rightVec)); 

: 작성의 방법에 비해

vector<int> rightVec = vector<int>(startIt, endIt); 

:

은 무엇 벤치 마크가 아래로 비등하는 벡터를 작성의 방법의 차이입니다 두 개의 코드 경로가 상당히 다릅니다.

는 두 번째 버전은 두 가지 이유에서 느린 것으로 예상된다 : 두 번째 경우

  • 대상 벡터, 저장하도록되어 얼마나 많은 요소 모르는 그래서 당신으로 계속 성장한다 삽입을 수행하십시오. 증가하는 벡터는 이전에 삽입 된 요소의 재 할당 및 복사/이동을 포함하므로 값 비쌉니다. move 앞에 적절한 reseve() 호출을 삽입하여 이러한 단점을 제거 할 수 있습니다. 이렇게하면이 코드 경로에서 성능 저하를 크게 줄일 수 있습니다.
  • 작은 성능 차이는 back_inserter으로 이동하여 첫 번째 경우에서 수행 된 대량 삽입에 대해 예상되는대로 대상 벡터에 요소 단위로 삽입된다는 사실 때문에 발생합니다. 이 두 점의 영향을 완화하는데주의를 기울여야 경우

, 당신은 이미 지적 된 바와 같이, int 요소에 해당하는 작업을 이동하고 복사 할 수 있습니다, 때문에 런타임은 거의 비슷 것으로 관찰됩니다.

1

귀하의 벤치 마크에 결함이 있으며 정확하지 않습니다.

  • 먼저 컴파일러 플래그를 언급하지 마십시오. 최적화를 사용 했습니까?

  • 가장 큰 문제는 int 개의 요소를 사용하고 있다는 것입니다. int 이동은 성능 측면에서 int 사본과 동일합니다.

  • 적절하고 완전한 벤치 마크를 얻으려면 g ++ 및 clang ++도 시도해야합니다.

  • std::vector<T>::reserve은 어디에도 전화하지 않습니다.

  • 컴파일러가 루프 을 적극적으로 최적화하지 않는다는 보장이 없습니다 (예 : 여러 사이클을 풀거나 융합하는 경우).


또한 "복사"벤치 마크에서 불필요한 이동을 수행하고 있습니다 :

vector<int> rightVec = vector<int>(leftVec.begin()+lenLeft+lenMid,leftVec.end());  
vector<int> midVec = vector<int>(leftVec.begin()+lenLeft,leftVec.begin()+lenLeft+lenMid); 

왜 그냥 ...

vector<int> rightVec(leftVec.begin()+lenLeft+lenMid,leftVec.end());  
vector<int> midVec(leftVec.begin()+lenLeft,leftVec.begin()+lenLeft+lenMid); 

...?

+0

여러분이 권장하는 변경 사항을 적용했지만 여전히 성능 차이가 있습니다. – newandlost