Heim  >  Artikel  >  Backend-Entwicklung  >  Leistungsvergleich beim Kopieren und Verschieben von Containern in C++-Containerbibliotheken

Leistungsvergleich beim Kopieren und Verschieben von Containern in C++-Containerbibliotheken

王林
王林Original
2024-06-05 22:28:00719Durchsuche

Das Verschieben von Containern ist schneller als das Kopieren, da durch die Bewegung das Kopieren von Elementen vermieden und der Elementbesitz direkt übertragen wird. Bei großen Containern kann das Verschieben des Containers die Leistung erheblich verbessern.

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

Leistungsvergleich des Kopierens und Verschiebens von Containern in der C++-Containerbibliothek

In C++ sind das Kopieren und Verschieben von Containern zwei Vorgänge, die zum Kopieren des Inhalts eines Containers verwendet werden. Das Verständnis der Unterschiede und Leistungsunterschiede zwischen den beiden ist für die Optimierung Ihres Codes von entscheidender Bedeutung.

Kopieren eines Containers

Durch das Kopieren von Containern wird eine neue Kopie des Containers erstellt, die eine Kopie aller Elemente im Originalcontainer enthält. Bei diesem Vorgang wird eine tiefe Kopie jedes Elements erstellt, was ein zeitaufwändiger Vorgang sein kann.

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

Container verschieben

Containerbewegungen „verschieben“ den Inhalt des ursprünglichen Containers in den neuen Container, anstatt eine Kopie zu erstellen. Dies ist ein einfacherer Vorgang, da die Elementeigentümerschaft direkt von einem Container auf einen anderen übertragen wird, ohne dass ein Kopiervorgang erforderlich ist.

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

Leistungsvergleich

Der Leistungsaufwand beim Kopieren von Containern ist höher als beim Verschieben, da letzteres den Schritt zum Kopieren von Elementen vermeidet. Bei großen Containern kann das Verschieben des Containers die Leistung erheblich verbessern.

Der folgende Code zeigt einen Vergleich der Kopier- und Verschiebungszeiten für verschiedene Containertypen bei unterschiedlichen Elementgrößen:

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

Ausgabe (Beispiel: Die tatsächlichen Ergebnisse können von System zu System variieren):

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

Wie die Ausgabe zeigt, z Bei allen Elementgrößen ist das Verschieben von Containern viel schneller als das Kopieren von Containern.

Fazit

Bei großen Containern ist das Verschieben des Containers die erste Wahl zum Kopieren des Containers, wenn der Originalcontainer nicht benötigt wird. Wenn Sie die Unterschiede zwischen Containerkopien und -verschiebungen verstehen, können Sie fundierte Entscheidungen treffen und die Leistung Ihres Codes optimieren.

Das obige ist der detaillierte Inhalt vonLeistungsvergleich beim Kopieren und Verschieben von Containern in C++-Containerbibliotheken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn