vector에는 초기화 방법에는 여러가지가 있다.
각각의 방법에는 메모리 할당의 시점과 횟수의 차이가 있다
// 벡터 예약 성능 테스트
void reservePerformanceTest()
{
std::cout << "\\n=== 벡터 예약 성능 테스트 ===\\n";
const int numElements = 10000000;
// 예약 없는 벡터
{
auto start = std::chrono::high_resolution_clock::now();
std::vector<int> vec;
int capa = vec.capacity(); // 초기 용량은 0
std::cout << "초기 용량: " << capa << std::endl;
std::cout << "초기 크기: " << vec.size() << std::endl;
for (int i = 0; i < numElements; ++i)
{
vec.push_back(i);
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "reserve 없음: " << elapsed.count() << "s\\n";
}
// 예약된 벡터
{
auto start = std::chrono::high_resolution_clock::now();
std::vector<int> vec;
vec.reserve(numElements);
int capa = vec.capacity(); // 초기 용량은 0
std::cout << "초기 용량: " << capa << std::endl;
std::cout << "초기 크기: " << vec.size() << std::endl;
for (int i = 0; i < numElements; ++i)
{
vec.push_back(i);
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "reserve 사용: " << elapsed.count() << "s\\n";
}
// 크기 초기화된 벡터
{
auto start = std::chrono::high_resolution_clock::now();
std::vector<int> vec(numElements);
int capa = vec.capacity(); // 초기 용량은 0
std::cout << "초기 용량: " << capa << std::endl;
std::cout << "초기 크기: " << vec.size() << std::endl;
for (int i = 0; i < numElements; ++i)
{
vec[i] = i;
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "크기 초기화: " << elapsed.count() << "s\\n";
}
// resize
{
auto start = std::chrono::high_resolution_clock::now();
std::vector<int> vec;
vec.resize(numElements, 0);
int capa = vec.capacity(); // 초기 용량은 0
std::cout << "초기 용량: " << capa << std::endl;
std::cout << "초기 크기: " << vec.size() << std::endl;
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "resize 초기화: " << elapsed.count() << "s\\n";
}
// std::iota 사용 (std::generate와 유사)
{
auto start = std::chrono::high_resolution_clock::now();
std::vector<int> vec(numElements);
std::iota(vec.begin(), vec.end(), 0);
int capa = vec.capacity(); // 초기 용량은 0
std::cout << "초기 용량: " << capa << std::endl;
std::cout << "초기 크기: " << vec.size() << std::endl;
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "std::iota 사용: " << elapsed.count() << "s\\n";
}
}
위 코드를 통해서 테스트 해볼 수 있고 결과는 아래와 같다
=== 벡터 예약 성능 테스트 ===
초기 용량: 0
초기 크기: 0
reserve 없음: 0.0909419s
초기 용량: 10000000
초기 크기: 0
reserve 사용: 0.0678026s
초기 용량: 10000000
초기 크기: 10000000
크기 초기화: 0.0220571s
초기 용량: 10000000
초기 크기: 10000000
resize 초기화: 0.00931919s
초기 용량: 10000000
초기 크기: 10000000
std::iota 사용: 0.0562888s