Vektor langsamer als Array initiieren ... warum?

8

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!

    
Aishwar 23.10.2009, 17:50
quelle

6 Antworten

16

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.

    
Jerry Coffin 23.10.2009, 17:53
quelle
8

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.

    
AraK 23.10.2009 17:55
quelle
5

Wenn Ihre nicht optimierte Vektorimplementierung Grenzen prüft, würde dies die Diskrepanz berücksichtigen.

    
Dan Blanchard 23.10.2009 17:56
quelle
4

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 .

    
Mike Dunlavey 23.10.2009 20:04
quelle
0

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

    
Davit Siradeghyan 23.10.2009 19:14
quelle
0

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.

%Vor%     
Max Lybbert 23.10.2009 19:57
quelle