Veröffentlichungserstellung in Visual Studio Strg + F5 10x langsamer als von außerhalb VS [geschlossen]

8

Ich habe eine mittelgroße native C ++ - Anwendung. Wenn ich es in Visual Studio (2008) ausführe, läuft es ungefähr 10x langsamer als wenn es von außerhalb von Visual Studio ausgeführt wird. Dies gilt sowohl für Debug- als auch für Release-Builds und tritt auf, wenn ich die Anwendung als Start Debugging (F5) und Start Without Debugging (Strg + F5) ausführe.

Mit anderen Worten: Das Ausführen eines Release-Builds in Visual Studio ohne ist zehnmal langsamer als das Ausführen derselben ausführbaren Datei von einer Eingabeaufforderung aus (oder von Windows Explorer aus).

Dinge, die ich versucht habe:

  • Es wird überprüft, dass keine Breakpoints, Tracepoint, Debugging usw. gesetzt sind. Es gab keine.
  • Einstellung von _NO_DEBUG_HEAP=1 in VS Debugging-Eigenschaften für die App. Keine Wirkung.
  • Einstellung von cmd /c set PATH , die mit Strg + F5 anstelle der App selbst ausgeführt und mit außerhalb von VS verfügbarem PATH verglichen wird. Kein Unterschied.
  • Ausführen von DependencyWalker in der EXE und Vergleichen mit Bibliotheken, die Visual Studio beim Laden der App als geladen anzeigt. Kein Unterschied.
  • Googeln und SO suchen, aber das kam nur mit den obigen Ideen oder behandelt mit F5 vs Ctrl + F5 Unterschiede (es gibt keine in meinem Fall).

Mir sind die Ideen ausgegangen, und ich wäre dankbar für Hinweise, wohin ich mich wenden oder was ich versuchen sollte.

Die Anwendung verwendet OpenGL und Qt und macht recht gewöhnliche Dinge: keine Lade- / Entlade-DLLs, Dateieingabe nur beim Start (3D-Modell und Shader), keine Dateiausgabe, wenige Drittanbieter-Libraries (und abgesehen von Qt) statisch verknüpft).

Um die Verletzung noch schlimmer zu machen, habe ich dieses Verhalten erst nach einem internen Refactoring der App erfahren. Zuvor lief es sowohl innerhalb als auch ohne VS gut. Dieses Refactoring beinhaltete hauptsächlich das Extrahieren einiger Funktionen in eine neu erstellte Basisklasse (dh Ändern von A > B Vererbung in A > C > B Vererbung, sehr wenige virtuelle Aufrufe) und Ersetzen einiger new[] Aufrufe durch std::vector s.

BEARBEITEN

Ich habe noch eine andere Sache versucht: In den Debugging-Eigenschaften der App setze das Ziel auf cmd /k und führe dann Strg + F5 aus, um cmd zu starten und die App über diese Befehlszeile auszuführen. Auf diese Weise läuft es mit normaler Geschwindigkeit (d.h. die 10x-Verlangsamung ist nicht vorhanden). Das ist natürlich für das Debuggen nutzlos, aber ich wollte es aus einem Gefühl der Vollständigkeit heraus erwähnen.

BEARBEITEN 2

Ich habe es gefunden: Es war eine merkwürdige Abhängigkeit vom Arbeitsverzeichnis. Wenn es von dem Verzeichnis gestartet wird, in dem sich die .vcproj befindet (was VS normalerweise mit F5 und Ctrl + F5 tut), würde ein relativer Pfad im Verzeichnis existieren und eine Debugging-Ausgabe (deren Existenz ich vergessen hätte) ist erfolgreich und verlangsamt den Lauf. Das Ausführen aus einem anderen Verzeichnis führte zu einem Fehler bei der Ausgabe, was zu einer schnelleren Ausführung führte.

Ich entschuldige mich bei allen, die ihre Zeit damit verbracht haben. Abstimmung zum Schließen.

    
Angew 12.12.2012, 14:31
quelle

1 Antwort

3

Aus meiner Erfahrung geht es um den Low-Fragmentierungs-Haufen. Aber du hast gesagt, du hast _NO_DEBUG_HEAP = 1 gesetzt, also weiß ich nicht, ob das die richtige Antwort ist, ich denke, du kannst es zumindest versuchen.

Der Heap mit geringer Fragmentierung (LFH) hilft, die Heapfragmentierung zu reduzieren. Wenn diese Option aktiviert ist, kann sie die Leistung Ihrer Anwendung um den Faktor 10 erhöhen, wenn Ihre Anwendung viel Speicherzuweisung verwendet.

LFH ist standardmäßig ab Windows Vista aktiviert, LFH ist jedoch deaktiviert Wenn ein Prozess unter einem Debugger ausgeführt wird, werden bestimmte Heap-Debug-Optionen automatisch für alle Heaps im Prozess aktiviert. Diese Heap-Debug-Optionen verhindern die Verwendung der LFH.

Dies erklärt, warum die Anwendung 10x langsamer läuft, wenn sie von VS gestartet wird. (Ich habe das gleiche Problem in der Vergangenheit festgestellt). Sie können die Funktion HeapQueryInformation verwenden Get Heap Information und geben Sie es aus, um zu überprüfen, ob es durch LFH deaktiviert ist.

Weitere Informationen zu LFH finden Sie in diesen beiden Artikeln:

  1. Stapel mit geringer Fragmentierung
  2. HeapSetInformation

Ein ähnlicher Beitrag im Forum: Warum läuft mein STL-Code so langsam, wenn ich den Debugger / die IDE angehängt habe?

    
Matt 13.12.2012 04:41
quelle