C++에서 배열(array)와 벡터(vector)의 속도를 비교해보았습니다.
테스트 환경은 Ubuntu 20.04와 Visual Studio 2019입니다.
2021. 3. 27 최초작성
아래 링크를 보고 궁금해져서 간단히 테스트를 해보았습니다.
https://stackoverflow.com/questions/3664272/is-stdvector-so-much-slower-than-plain-arrays
전문적으로 관련 테스트를 진행해본 적이 없어서 정확한 방법이 아닐 수도 있는 점 감안하고 보세요.
틀린 점이나 개선점이 있으면 댓글을 남겨주세요.
시간 측정 방법은 아래 링크를 참고했습니다.
https://stackoverflow.com/questions/2808398/easily-measure-elapsed-time
노트북에 전원을 연결하지 않은 상태로 해서 테스트 결과가 일정하게 나오지 않는듯합니다.?
Ubuntu 20.04
값을 쓸 때 vector에서 push_back을 사용하는 방법이 제일 느리고 변수에 대입하는 방법이 제일 빨랐습니다.
값을 읽어올 때에는 거의 비슷하지만 변수에서 읽어올 때가 빠르네요.
vector의 경우 push_back을 사용하는 것보다 vector의 크기를 미리 정해놓고 대입하는 방식이 더 낫네요.
[0] [write] vector push_back - Time difference = 21883[ns] [read] vector push_back - Time difference = 2977[ns] [write] vector assignment - Time difference = 2996[ns] [read] vector assignment - Time difference = 2897[ns] [write] array assignment - Time difference = 2556[ns] [read] array assignment - Time difference = 2427[ns] [1] [write] vector push_back - Time difference = 16976[ns] [read] vector push_back - Time difference = 3406[ns] [write] vector assignment - Time difference = 3071[ns] [read] vector assignment - Time difference = 2866[ns] [write] array assignment - Time difference = 2437[ns] [read] array assignment - Time difference = 2501[ns] [2] [write] vector push_back - Time difference = 27008[ns] [read] vector push_back - Time difference = 3176[ns] [write] vector assignment - Time difference = 3058[ns] [read] vector assignment - Time difference = 2873[ns] [write] array assignment - Time difference = 2491[ns] [read] array assignment - Time difference = 2504[ns] |
Visual Studio 2019
이유를 찾지 못했는데 시간 측정 방법에 문제가 생기는 듯합니다.
첫번째 측정한 “[write] vector push_back” 항목 이후로는 정확한 값 같지 않습니다.
[0] [write] vector push_back - Time difference = 16900[ns] [read] vector push_back - Time difference = 100[ns] [write] vector assignment - Time difference = 400[ns] [read] vector assignment - Time difference = 100[ns] [write] array assignment - Time difference = 100[ns] [read] array assignment - Time difference = 0[ns] [1] [write] vector push_back - Time difference = 13600[ns] [read] vector push_back - Time difference = 100[ns] [write] vector assignment - Time difference = 300[ns] [read] vector assignment - Time difference = 0[ns] [write] array assignment - Time difference = 100[ns] [read] array assignment - Time difference = 100[ns] [2] [write] vector push_back - Time difference = 13900[ns] [read] vector push_back - Time difference = 0[ns] [write] vector assignment - Time difference = 400[ns] [read] vector assignment - Time difference = 100[ns] [write] array assignment - Time difference = 100[ns] [read] array assignment - Time difference = 0[ns] |
테스트에 사용한 코드입니다.
#include <iostream>
#include <vector>
#include <chrono>
int main()
{
for (int i = 0; i < 3; i++)
{
std::cout << "[" << i << "]" << std::endl;
{
std::vector<int> v;
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
for (int i = 0; i < 1000; i++)
v.push_back(i);
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
// c++ 11로 컴파일하면 걸린 시간이 절반으로 감소
std::cout << "[write] vector push_back - Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << "[ns]" << std::endl;
std::chrono::steady_clock::time_point begin2 = std::chrono::steady_clock::now();
for (int i = 0; i < 1000; i++)
{
int t = v[i];
}
std::chrono::steady_clock::time_point end2 = std::chrono::steady_clock::now();
std::cout << "[read] vector push_back - Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - begin2).count() << "[ns]" << std::endl;
}
{
std::vector<int> v;
v.resize(1000);
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
for (int i = 0; i < 1000; i++)
v[i] = i;
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::cout << "[write] vector assignment - Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << "[ns]" << std::endl;
std::chrono::steady_clock::time_point begin2 = std::chrono::steady_clock::now();
for (int i = 0; i < 1000; i++)
{
int t = v[i];
}
std::chrono::steady_clock::time_point end2 = std::chrono::steady_clock::now();
std::cout << "[read] vector assignment - Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - begin2).count() << "[ns]" << std::endl;
}
{
int v[1000];
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
for (int i = 0; i < 1000; i++)
v[i] = i;
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::cout << "[write] array assignment - Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << "[ns]" << std::endl;
std::chrono::steady_clock::time_point begin2 = std::chrono::steady_clock::now();
for (int i = 0; i < 1000; i++)
{
int t = v[i];
}
std::chrono::steady_clock::time_point end2 = std::chrono::steady_clock::now();
std::cout << "[read] array assignment - Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - begin2).count() << "[ns]" << std::endl;
}
}
}
'프로그래밍 노트 > C&C++' 카테고리의 다른 글
C++ set 예제 - 중복 원소 검사 (0) | 2021.09.22 |
---|---|
C 예제 - CSV 파일 읽기 (6) | 2021.07.04 |
C++ shared_ptr 객체를 전달받은 함수에서 사용 후 해제하는 방법 (0) | 2021.02.15 |
Visual Studio 2019용으로 libiconv 빌드하기 및 utf8 <-> cp949 변환 예제 (2) | 2021.02.09 |
Visual Studio 2019에서 MySQL/MariaDB C API 예제 사용하기 (2) | 2021.02.08 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!