ホームページ >バックエンド開発 >C++ >C++ コンテナ ライブラリでのコンテナのコピーと移動のパフォーマンスの比較

C++ コンテナ ライブラリでのコンテナのコピーと移動のパフォーマンスの比較

王林
王林オリジナル
2024-06-05 22:28:00802ブラウズ

コンテナの移動は、要素のコピーを回避し、要素の所有権を直接転送するため、コピーよりも高速です。大きなコンテナの場合、コンテナを移動するとパフォーマンスが大幅に向上します。

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

C++ コンテナ ライブラリでのコンテナのコピーと移動のパフォーマンス比較

C++ では、コンテナのコピーと移動は、コンテナの内容をコピーするために使用される 2 つの操作です。コードを最適化するには、この 2 つの違いとパフォーマンスの違いを理解することが重要です。

コンテナのコピー

コンテナのコピーでは、元のコンテナ内のすべての要素のコピーを含むコンテナの新しいコピーが作成されます。この操作には各要素のディープ コピーの実行が含まれますが、これは時間のかかるプロセスになる可能性があります。

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

出力 (例、実際の結果はシステムによって異なる場合があります):

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。