로그 파일을 읽어서 수천만 개의 정수 데이터를 vector에 저장해 분석하려고 합니다. 그런데 데이터 양이 많아질수록 삽입 속도가 눈에 띄게 느려져서 원인을 찾고 있습니다.
코드:
#include <iostream>
#include <vector>
#include <chrono>
int main() {
std::vector<int> data;
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 50000000; ++i) {
data.push_back(i);
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "Time: " << diff.count() << "s" << std::endl;
return 0;
}
오류: 특정 데이터 개수(약 1,000만 개)를 넘어가는 시점부터 push_back 한 번에 걸리는 시간이 불규칙하게 튀면서 전체 실행 시간이 예상보다 훨씬 길어집니다.
시도: 컴파일러 최적화 옵션을 -O3로 설정해 보았고, 다른 데이터 타입(long long)으로 바꿔보았지만 증상이 비슷합니다.
질문: vector의 내부 동작 방식 때문에 발생하는 성능 저하가 맞는지, 이 상황에서 성능을 개선하려면 어떻게 해야 하는지 궁금합니다.
댓글5
-
빗방울
2026.10.30 01:36
-
빗방울
2026.10.30 04:06
맞네요 reserve가 정답인듯ㅋㅋ
이거 모르면 진짜 삽질 제대로 하죠 ㄷㄷ
-
빗방울
2026.10.30 05:12
와 설명 진짜 깔끔하시네요ㅋㅋ
이거 정석 답변인듯ㄷㄷ
저도 예전에 이거 몰라서 한참 헤맸던 기억나네요ㅋㅋ
-
빗방울
2026.10.30 08:43
와 설명 진짜 깔끔하시네요ㅋㅋ 이거 완전 정석 답변인듯ㄷㄷ 저도 예전에 이거 몰라서 한참 헤맸던 기억나네요ㅋㅋ
-
빗방울
2026.10.30 04:05
위에 reserve 말 나왔는데
혹시 데이터 양이 더 늘어나면 아예 std::deque 고려해보시는 건 어떠신지ㅋㅋ
그건 재할당 비용이 덜 들어서 나을 수도 있을 듯함
모든 이야기1454
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
총 1454개의 이야기
std::vector는 내부적으로 동적 배열을 사용하기 때문에, 할당된 용량(capacity)이 가득 차면 더 큰 새로운 메모리 공간을 할당하고 기존 요소들을 모두 복사하는 '재할당(reallocation)' 과정이 발생합니다. 데이터 양이 많아질수록 이 복사 비용이 기하급수적으로 증가하며, 특히 수천만 개의 데이터를 다룰 때는 메모리 단편화나 OS의 메모리 할당 오버헤드로 인해 말씀하신 것처럼 실행 시간이 불규칙하게 튀는 현상이 나타날 수 있습니다.이 문제를 해결하는 가장 확실한 방법은
reserve()함수를 사용하는 것입니다. 저장할 데이터의 총량을 미리 알고 있다면, 루프 시작 전에data.reserve(50000000);를 호출하여 메모리를 한 번에 미리 확보하세요. 이렇게 하면 중간에 발생하는 불필요한 재할당과 복사 과정을 완전히 제거할 수 있어 성능이 비약적으로 향상될 것입니다.