>백엔드 개발 >C++ >C++ 컨테이너 라이브러리의 컨테이너 복사 및 이동 성능 비교

C++ 컨테이너 라이브러리의 컨테이너 복사 및 이동 성능 비교

王林
王林원래의
2024-06-05 22:28:00801검색

컨테이너 이동은 복사보다 빠릅니다. 이동은 요소 복사를 방지하고 요소 소유권을 직접 이전하기 때문입니다. 대형 컨테이너의 경우 컨테이너를 이동하면 성능이 크게 향상될 수 있습니다.

C++ 容器库中容器拷贝和移动的性能比较

C++ 컨테이너 라이브러리의 컨테이너 복사 및 이동 성능 비교

C++에서 컨테이너 복사 및 이동은 컨테이너의 내용을 복사하는 데 사용되는 두 가지 작업입니다. 코드를 최적화하려면 둘 사이의 차이점과 성능 차이를 이해하는 것이 중요합니다.

컨테이너 복사

컨테이너 복사는 원본 컨테이너에 있는 모든 요소의 복사본을 포함하는 컨테이너의 새 복사본을 생성합니다. 이 작업에는 각 요소의 전체 복사본을 수행하는 작업이 포함되며, 이는 시간이 많이 걸리는 프로세스일 수 있습니다.

std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2(vec1); // 拷贝 vec1

컨테이너 이동

컨테이너는 복사본을 만드는 대신 원본 컨테이너의 콘텐츠를 새 컨테이너로 "이동"합니다. 이는 복사를 수행하지 않고 요소 소유권을 한 컨테이너에서 다른 컨테이너로 직접 전송하기 때문에 더 가벼운 작업입니다.

std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = std::move(vec1); // 移动 vec1

성능 비교

컨테이너 복사의 성능 오버헤드는 이동보다 높습니다. 이동은 요소 복사 단계를 피하기 때문입니다. 대형 컨테이너의 경우 컨테이너를 이동하면 성능이 크게 향상될 수 있습니다.

다음 코드는 다양한 요소 크기와 다양한 컨테이너 유형의 복사 및 이동 시간을 비교한 것입니다.

#include <ctime>
#include <vector>
#include <list>

int main()
{
    const int iterations = 100000;

    for (int size = 10000; size <= 100000; size += 10000)
    {
        // 创建容器
        std::vector<int> vec(size);
        std::list<int> list(size);

        // 记录拷贝时间
        std::clock_t start = std::clock();
        for (int i = 0; i < iterations; i++)
        {
            std::vector<int> vecCopy(vec);
        }
        std::clock_t end = std::clock();
        std::cout << "Vector copy: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << std::endl;

        start = std::clock();
        for (int i = 0; i < iterations; i++)
        {
            std::list<int> listCopy(list);
        }
        end = std::clock();
        std::cout << "List copy: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << std::endl;

        // 记录移动时间
        start = std::clock();
        for (int i = 0; i < iterations; i++)
        {
            std::vector<int> vecMove(std::move(vec));
        }
        end = std::clock();
        std::cout << "Vector move: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << std::endl;

        start = std::clock();
        for (int i = 0; i < iterations; i++)
        {
            std::list<int> listMove(std::move(list));
        }
        end = std::clock();
        std::cout << "List move: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << std::endl << std::endl;
    }

    return 0;
}

Output(예: 실제 결과는 시스템마다 다를 수 있음):

Vector copy: 0.052s
List copy: 0.009s

Vector move: 0.014s
List move: 0.003s

...

Vector copy: 0.542s
List copy: 0.058s

Vector move: 0.082s
List move: 0.013s

출력에 표시된 대로, 모든 요소 크기, 컨테이너 이동은 컨테이너 복사보다 훨씬 빠릅니다.

결론

대형 컨테이너의 경우 원래 컨테이너가 필요하지 않을 때 컨테이너를 복사하려면 컨테이너를 이동하는 것이 첫 번째 선택입니다. 컨테이너 복사와 이동의 차이점을 이해하면 정보에 입각한 결정을 내리고 코드 성능을 최적화할 수 있습니다.

위 내용은 C++ 컨테이너 라이브러리의 컨테이너 복사 및 이동 성능 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.