반응형

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;
        }
    }
}

 




반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts