Vergleich der Zugriffsleistung von Daten in Heap und Stack

9

Es ist allgemein bekannt, dass für die meisten Algorithmen das Zuweisen und Freigeben von Daten auf dem Stapel viel schneller ist als auf dem Heap. In C ++ ist der Unterschied im Code wie

%Vor%

gegen

%Vor%

Aber gibt es irgendwelche signifikanten Unterschiede, wenn es darum geht, auf Daten zuzugreifen und zu berechnen, die entweder auf dem Heap oder auf dem Stapel liegen? I.e. Gibt es eine Geschwindigkeitsdifferenz für

? %Vor%

Der Code sollte auf mehreren verschiedenen Architekturen laufen, daher versuchen und messen nicht funktionieren.

    
shuhalo 11.08.2010, 06:56
quelle

4 Antworten

4

Es kann (stark systemabhängige) Probleme mit Cache-Lokalität und Lese- / Schreibfehlern geben. Wenn Sie Ihr Programm auf den Stack - und Heap-Daten ausführen, ist es (abhängig von Ihrer Cache-Architektur) denkbar, dass Sie mehr Cache-Misses bekommen, als wenn Sie es vollständig in einer Continuous-Region ausführen der Stapel. Hier ist das Papier zu dieser Ausgabe von Andrew Appel (von SML / NJ) und Zhong Shao, wo sie genau diese Sache untersuchen, weil die Stack / Heap-Zuweisung ein Thema für die Implementierung funktionaler Sprachen ist:

Ссылка

Sie haben einige Performance-Probleme mit Schreibfehlern festgestellt, aber geschätzt, dass diese durch Fortschritte beim Caching behoben werden.

Meine Vermutung für einen modernen Desktop / Server-Rechner lautet also: Wenn Sie nicht stark optimierten, architekturspezifischen Code verwenden, der Daten entlang der Cache-Zeilen streamt, werden Sie keinen Unterschied zwischen Stack- und Heap-Zugriffen bemerken. Bei Geräten mit kleinen Caches (wie ARM / MIPS-Controller) können sich die Dinge unterscheiden, wobei das Ignorieren des Caches trotzdem spürbare Leistungseffekte haben kann.

    
Nordic Mainframe 11.08.2010, 07:48
quelle
1

Der Stack befindet sich häufiger im CPU-Cache , was in einigen (meisten Fällen) Fällen schneller sein kann.

Aber die genaueste Antwort ist wahrscheinlich: Es kommt darauf an ...

    
Michel de Ruiter 11.08.2010 07:08
quelle
1

Wird als einzelne Anweisung genommen, ist nicht wichtig.
Wenig kann ohne mehr Kontext gesagt werden. Es gibt einige Effekte zugunsten des Stacks, die praktisch immer vernachlässigbar sind.

  • Der Stack ist wahrscheinlich bereits im Cache, ein neu zugewiesener Heap-Block ist es wahrscheinlich nicht. Dies ist jedoch nur eine erste Ausführungsstrafe. Bei beträchtlichen Datenmengen würden Sie den Cache trotzdem verwerfen

  • Die Stack-Zuweisung selbst ist ein bisschen billiger als die Heap-Zuweisung, weil die Zuweisung einfacher ist

  • Langfristig ist das Hauptproblem eines Heaps in der Regel eine Fragmentierung, ein "kumulierter Kostenfaktor", der (normalerweise) nicht einzelnen Zuweisungen zugeordnet werden kann, aber die Kosten weiterer Zuweisungen erheblich erhöhen kann.

Die Messung dieser Effekte ist zumindest schwierig.

Empfehlung : Leistung ist hier nicht das Entscheidende. Portabilität und Skalierbarkeit empfehlen, den Heap für alle bis auf eine sehr geringe Datenmenge zu verwenden.

    
peterchen 11.08.2010 07:59
quelle
-1

Sperrzuordnung: Es sollte keinen erkennbaren Unterschied zwischen dem Zugriff auf Daten geben, unabhängig davon, ob sie stack- oder heap-basiert ist - es ist nur Speicher am Ende des Tages.

    
Will A 11.08.2010 06:59
quelle

Tags und Links