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.
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!