Maison >développement back-end >C++ >Comparaison des performances de copie et de déplacement de conteneurs dans les bibliothèques de conteneurs C++

Comparaison des performances de copie et de déplacement de conteneurs dans les bibliothèques de conteneurs C++

王林
王林original
2024-06-05 22:28:00804parcourir

Le mouvement du conteneur est plus rapide que la copie, car le mouvement évite la copie des éléments et transfère directement la propriété des éléments. Pour les grands conteneurs, le déplacement du conteneur peut améliorer considérablement les performances.

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

Comparaison des performances de copie et de déplacement de conteneur dans la bibliothèque de conteneurs C++

En C++, la copie et le déplacement de conteneur sont deux opérations utilisées pour copier le contenu d'un conteneur. Comprendre les différences et les différences de performances entre les deux est essentiel pour optimiser votre code.

Copie d'un conteneur

La copie d'un conteneur crée une nouvelle copie du conteneur qui contient une copie de tous les éléments du conteneur d'origine. Cette opération implique d’effectuer une copie complète de chaque élément, ce qui peut prendre du temps.

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

Déplacement des conteneurs

Le conteneur déplace "déplace" le contenu du conteneur d'origine dans le nouveau conteneur plutôt que de créer une copie. Il s'agit d'une opération plus légère car elle transfère directement la propriété des éléments d'un conteneur à un autre sans effectuer de copie.

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

Comparaison des performances

La surcharge de performances de la copie de conteneur est supérieure à celle du déplacement car ce dernier évite l'étape de copie d'élément. Pour les grands conteneurs, le déplacement du conteneur peut améliorer considérablement les performances.

Le code suivant montre une comparaison des temps de copie et de déplacement pour différents types de conteneurs et différentes tailles d'éléments :

#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 (par exemple, les résultats réels peuvent varier d'un système à l'autre) :

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

Comme le montre la sortie, pour pour toute la taille des éléments, le déplacement de conteneurs est beaucoup plus rapide que la copie de conteneurs.

Conclusion

Pour les grands conteneurs, déplacer le conteneur est le premier choix pour copier le conteneur lorsque le conteneur d'origine n'est pas nécessaire. En comprenant la différence entre la copie et le déplacement de conteneurs, vous pouvez prendre des décisions éclairées et optimiser les performances de votre code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn