Ich habe zwei Dinge versucht: (Pseudocode unten)
%Vor%und
%Vor%Ich habe beide Programme ausgeführt und die Zeit mit dem Shell-Befehl "time" festgelegt. Programm 1 läuft in 5 Sekunden, Programm 2 läuft in 30 Sekunden. Ich habe beide Programme mit aktivierter Compiler-Optimierung ausgeführt, und beide Programme liefen ungefähr zur gleichen Zeit (0.38s). Ich bin verwirrt von diesen Ergebnissen. Kann mir bitte jemand erklären, warum das passiert?
Danke!
Für die Vorlage wird die Subskription mit operator [] durchgeführt. Wenn die Optimierung ausgeschaltet ist, wird dies normalerweise als echter Funktionsaufruf generiert, wodurch eine Menge Overhead zu etwas so Einfachem wie Subskribierung in ein Array hinzugefügt wird. Wenn Sie die Optimierung aktivieren, wird sie inline generiert, wodurch der Overhead beseitigt wird.
Im Debugging-Modus bieten Implementierungen von std::vector
eine große Anzahl von Laufzeitprüfungen, um die Benutzerfreundlichkeit zu verbessern. Diese Überprüfung ist für native Arrays nicht verfügbar. Wenn Sie beispielsweise in VC2008 Ihr vector
-Beispiel im Debugging-Modus kompilieren, ist range-checking
gerade im Fall von operator[]
vorhanden.
Wenn Ihre nicht optimierte Vektorimplementierung Grenzen prüft, würde dies die Diskrepanz berücksichtigen.
Das sind gute Antworten, aber es gibt einen schnellen Weg, den Sie selbst herausfinden können.
Sie sehen einen 6-zu-1-Unterschied in der Leistung, richtig? Führen Sie einfach die langsame und drücken Sie die "Pause" -Taste. Dann schau dir den Call-Stack an. Die Wahrscheinlichkeit ist 5 von 6 (83%), dass Sie genau sehen werden, wie es diese 25 zusätzlichen Sekunden ausgibt. Tun Sie es mehrmals, um so viel Einblick zu bekommen, wie Sie wollen.
Für den optimierten Fall, machen Sie das gleiche mit Programm 1. Da es 13-mal langsamer ist als das optimierte Programm, werden Sie den Grund dafür in jeder "Pause" sehen, mit Wahrscheinlichkeit 12/13 = 92%.
Das ist eine Anwendung von diese Technik .
weil, wenn Sie Vektor arr (10000) schreiben; du erschaffst ein Objekt, nennst seine Funktionen ... wann und es wird langsamer sein als bei der Erstellung von int arr [10000];
In Ihren Beispielen befindet sich das Array auf dem Stapel. Der Zugriff auf Daten im Array beinhaltet den Zugriff auf Daten auf dem Stack. Das ist schnell.
Auf der anderen Seite, während die vector
auf dem Stapel ist, werden die Daten für eine std::vector
irgendwo anders zugewiesen (standardmäßig wird sie auf dem Heap über std::allocator
zugewiesen). Der Zugriff auf Daten in vector
beinhaltet den Zugriff auf Daten auf dem Heap. Das ist viel langsamer als der Zugriff auf Daten auf dem Stack.
Sie bekommen allerdings etwas für die Leistungsproblematik. std::vector
ist erweiterbar, ein reguläres Array nicht. Außerdem muss die Größe eines std::vector
nicht zur Kompilierzeitkonstante passen, während die Größe eines Arrays auf dem Stack dies tut. Ein haufenzugewiesenes Array (über operator new[]
) muss keine Kompilierzeitkonstante sein. Wenn Sie ein Heap-zugeordnetes Array mit einem std::vector
vergleichen, werden Sie feststellen, dass die Leistung viel näher ist.
Tags und Links optimization c++ performance vector