트위터에서 @All2one님을 통해서 GCC 컴파일러에서 RValue Reference의 Move Semantics를 사용했을 경우와 그렇지 않은 경우 STL에서 얼마만큼의 성능 차이가 나는지 테스트를 한 결과를 보았습니다.
사이트 주소는 http://cpp-next.com/archive/2010/10/howards-stl-move-semantics-benchmark/
입니다.
이것은 GCC 컴파일러를 사용한 경우라서 저는 VC++을 사용하여 어떤 결과가 나오는지 궁금해서 테스트 해 보았습니다.
RValue Reference을 사용하지 않는 가장 최신의 컴파일러는 VC++ 9(VS2008)이므로 VC++10과 VC++9를 같은 코드로 컴파일한 후 실행하였습니다.
먼저 테스트한 컴퓨터의 하드웨어 사양은 아래와 같습니다.
테스트 코드는 아래와 같습니다(GCC로 테스트한 것과 같은 코드입니다).
#include <vector>
#include <iostream>
#include <time.h>
#include <set>
#include <algorithm>
const unsigned N = 3001;
extern bool some_test;
std::set<int>
get_set(int)
{
std::set<int> s;
for (int i = 0; i < N; ++i)
while (!s.insert(std::rand()).second)
;
if (some_test)
return s;
return std::set<int>();
}
std::vector<std::set<int> >
generate()
{
std::vector<std::set<int> > v;
for (int i = 0; i < N; ++i)
v.push_back(get_set(i));
if (some_test)
return v;
return std::vector<std::set<int> >();
}
float time_it()
{
clock_t t1, t2, t3, t4;
clock_t t0 = clock();
{
std::vector<std::set<int> > v = generate();
t1 = clock();
std::cout << "construction took " << (float)((t1 - t0)/(double)CLOCKS_PER_SEC) << std::endl;
std::sort(v.begin(), v.end());
t2 = clock();
std::cout << "sort took " << (float)((t2 - t1)/(double)CLOCKS_PER_SEC) << std::endl;
std::rotate(v.begin(), v.begin() + v.size()/2, v.end());
t3 = clock();
std::cout << "rotate took " << (float)((t3 - t2)/(double)CLOCKS_PER_SEC) << std::endl;
}
t4 = clock();
std::cout << "destruction took " << (float)((t4 - t3)/(double)CLOCKS_PER_SEC) << std::endl;
std::cout << "done" << std::endl;
return (float)((t4-t0)/(double)CLOCKS_PER_SEC);
}
int main()
{
std::cout << "N = " << N << '\n';
float t = time_it();
std::cout << "Total time = " << t << '\n';
}
bool some_test = true;
< 결과 >
이 결과를 보면 생성과 알고리즘을 사용했을 때 많은 차이가 나는 것을 알 수 있습니다.
기존에 STL의 알고리즘을 자주 사용한 경우라면 VC++ 10으로 컴파일만 해도 어느 정도의 성능 향상을 얻을 수 있을 것 같습니다.
'C++0x' 카테고리의 다른 글
VC++ 10에 새롭게 추가된 STL. 다시 시작합니다 (0) | 2011.04.11 |
---|---|
[STL] 7. <algorithm>에 추가된 새로운 함수들 copy_if, copy_n, find_if_not (3/5) (0) | 2010.10.25 |
VS2010에서 nullptr의 알려진 버그 (0) | 2010.09.30 |
[STL] 6. <algorithm>에 추가된 새로운 함수들 all_of, any_of, none_of (2/5) (2) | 2010.09.29 |
[STL] 5. <algorithm>에 추가된 새로운 함수들 (1/5) (0) | 2010.08.31 |