Frage

Unsere Anwendung benötigt mehr Zeit deutlich nach einem Neustart (Kaltstart) zu starten, als wenn sie schon einmal geöffnet wurde (Warmstart).

Die meisten (wenn nicht alle) der Unterschied scheint das Laden von DLLs zu kommen, wenn der DLLs' sind im Cache-Speicherseite laden sie viel schneller. Wir haben versucht, mit ClearMem Neustart zu simulieren (da seine viel weniger Zeit in Anspruch als tatsächlich Neustart) und bekam gemischte Ergebnisse, auf einigen Maschinen schien es einen Neustart sehr konsequent zu simulieren und in einigen nicht.

Um es zusammenzufassen meine Fragen sind:

  1. Haben Sie Unterschiede in der Produkteinführungszeit zwischen Kalt- und Warmstarts erlebt?
  2. Wie haben Sie mit solchen Unterschieden delt?
  3. Kennen Sie einen Weg, um zuverlässig einen Neustart zu simulieren?

Edit:

Klärungen für Bemerkungen:

  • Die Anwendung ist meist native C ++ mit einigen .NET (der ersten .NET-Assembly, die geladen wird bezahlt für die CLR).
  • Wir suchen die Ladezeit zu verbessern, natürlich haben wir unseren Anteil an Profilerstellung und verbessert die Hotspots in unserem Code.

Etwas, das ich vergessen zu erwähnen, dass wir eine gewisse Verbesserung durch Umbasierung alle unsere Binärdateien bekam so die Lade es zur Ladezeit nicht zu tun haben.

War es hilfreich?

Lösung

Wie haben Sie Ihren Code Profil? Nicht alle Profilierungsverfahren sind gleich und einige finden Hotspots besser als andere. Laden Sie viele Dateien? Wenn ja, Fragmentierung der Festplatte und versuchen, Zeit ins Spiel kommen könnte.

Vielleicht klebt sogar grundlegende Timing-Informationen in den Code, in eine Protokolldatei zu schreiben und die Dateien auf Kalt- / Warmstart Prüfung wird dazu beitragen, identifizieren mit den App der Zeit zu verbringen.

Ohne weitere Informationen, würde ich zuneigen Dateisystem / Festplatten-Cache als der wahrscheinlichen Unterschied zwischen den beiden Umgebungen. Wenn das der Fall ist, dann müssen Sie entweder weniger Zeit Laden von Dateien im Voraus verbringen, oder schnellere Wege finden, um Dateien zu laden.

Beispiel: Wenn Sie viele binäre Datendateien laden, schnelleren Laden von ihnen in einer einzigen Datei kombiniert, dann eine Slerp der gesamten Datei in den Speicher in einem Schreib- und deren Inhalte analysieren. Weniger Scheibe sucht und Zeit verbringen weg von Platte zu lesen. Auch hier vielleicht, dass keine Anwendung findet.

Ich weiß es nicht ohne Weiteres von Werkzeugen der Festplatte / Dateisystem-Cache zu löschen, aber man konnte eine schnelle Anwendung schreibt eine Reihe von nicht verwandten Dateien von Festplatte zu lesen, die Dateisystem / Festplatten-Cache zu veranlassen, mit unterschiedlichen Informationen zu ladende .

Andere Tipps

Wie bei Neustarts Simulation, haben Sie darüber nachgedacht, Ihre Anwendung von einem virtuellen PC läuft? Durch Virtualisierung können Sie eine Reihe von Bedingungen über bequem replizieren und immer wieder.

Ich würde auch irgendeine Art von Profilierungs App betrachtet das Stück Code zu erkennen, die Zeit verursacht liegt, und dann macht das Urteil Anruf darüber, wie viel von diesem Code wirklich notwendig ist, oder wenn es auf eine andere Weise erreicht werden kann.

Es wäre schwer, um wirklich einen Neustart in der Software zu simulieren. Beim Neustart werden alle Geräte in der Maschine ihre Resetbit erhalten behauptet, die alle Speichersystemweite führen sollte verloren gehen.

In einer modernen Maschine haben Sie, Speicher und Caches überall: es gibt das VM-Subsystem, das Speicherseite für das Programm speichert, dann haben Sie das Betriebssystem bekommen den Inhalt von Dateien im Speicher zwischenspeichern, dann haben Sie, die on-Disk-Puffer von Sektoren auf der Festplatte selbst. Sie können sich wahrscheinlich den OS-Caches zurückgesetzt werden, aber der On-Disk-Puffer auf dem Laufwerk? Ich weiß nicht, von einer Art und Weise.

Morten Christiansen sagte:

  

Eine Möglichkeit, Anwendungen zu machen beginnt Kaltstart schneller (Art) wird zum Beispiel durch verwendet Adobe Reader, die von einigen der Dateien beim Start geladen, wodurch den Kaltstart von den Benutzern versteckt. Dies ist nur anwendbar, wenn das Programm nicht sofort starten soll.

Das macht die Kunden zahlen für unsere App bei jedem Systemstart initialisiert wird, auch wenn es nicht benutzt wird, ich weiß nicht wirklich, wie die Option (ebenso wenig wie Raymond ).

Ein erfolgreicher Weg Start der Anwendung zu beschleunigen ist DLLs schalten verzögerungs Last. Dies ist eine Low-Cost-Änderung (einige Hantieren mit Projekteinstellungen), kann aber Inbetriebnahme deutlich schneller machen. Danach laufen depends.exe in Profilierungsmodus, um herauszufinden, welche DLLs Last während des Startvorgangs sowieso, und die Verzögerungslast auf sie zurück. Denken Sie daran, dass Sie auch verzögerungs Last meisten Windows-DLLs die Sie benötigen.

Eine sehr effektive Technik zur Anwendung Kaltstartzeit zu verbessern ist die Optimierung Funktion Link bestellen.

Der Visual Studio-Linker können Sie in einer Datei-Listen übergeben alle Funktionen in dem Modul verbunden ist (oder nur einige von ihnen - es muss nicht alle von ihnen sein), und der Linker die Funktionen legen neben sie im Speicher.

Wenn die Anwendung gestartet wird, gibt es typischerweise Funktionen der gesamten Anwendung init aufruft. Viele dieser Anrufe werden auf eine Seite, die noch nicht im Speicher ist, was zu einem Seitenfehler und eine Scheibe suchen. Das ist, wo langsamer Start herkommt.

Die Optimierung Ihre Anwendung, so dass all diese Funktionen zusammen sind, kann ein großer Gewinn sein.

Überprüfen Sie heraus Profil Guided Optimization in Visual Studio 2005 oder später. Einer der Sache sthat PGO tut, für Sie Funktion Link zu sehen.

Es ist ein bisschen schwierig in einen Build-Prozess zu arbeiten, denn mit PGO Sie verknüpfen müssen, führen Sie Ihre Anwendung, und dann wieder Verbindung mit dem Ausgang aus dem Profil laufen. Dies bedeutet, dass Ihr Build-Prozess eine Laufzeitumgebung haben muss und sich Aufräumen nach schlechten baut und all das, aber die Auszahlung ist in der Regel ab 10 oder mehr schneller Kaltstart ohne Code-Änderungen.

Es gibt einige weitere Informationen über PGO hier:

http://msdn.microsoft.com/en-us/library /e7k32f4k.aspx

Als eine Alternative, um die Liste zu funktionieren, nur Gruppe den Code, der in den gleichen Abschnitten aufgerufen wird:

#pragma code_seg(".startUp")
 //...
#pragma code_seg

#pragma data_seg(".startUp")
 //...
#pragma data_seg

Es sollte einfach sein, wie Ihre Code-Änderungen zu erhalten, hat aber den gleichen Nutzen wie die Funktion Auftragsliste.

Ich bin nicht sicher, ob die Funktion Auftragsliste globale Variablen als auch geben kann, aber diese Pragma data_seg verwenden würde einfach funktionieren.

Eine Möglichkeit, Anwendungen zu machen beginnt Kaltstart schneller (Art) wird zum Beispiel durch verwendet Adobe Reader, die von einigen der Dateien beim Start geladen, wodurch den Kaltstart von den Benutzern versteckt. Dies ist nur anwendbar, wenn das Programm nicht sofort starten soll.

Ein weiterer Hinweis ist, dass .NET 3.5SP1 angeblich hat sich viel verbessert Kaltstartgeschwindigkeit, obwohl, wie viel, kann ich nicht sagen.

Es könnte die NICs (LAN-Karten) und dass Ihre Anwendung ist abhängig von bestimmten anderen Dienste, die das Netz kommen benötigen. So allein Ihre Anwendung Profilieren kann nicht ganz Ihnen sagen, aber Sie sollten die Abhängigkeiten für Ihre Anwendung prüfen.

Wenn Ihre Anwendung ist nicht sehr kompliziert, können Sie einfach kopieren Sie alle ausführbaren Dateien in ein anderes Verzeichnis, sollte es zu einem Neustart ähnlich sein. (Ausschneiden und Einfügen scheint nicht funktioniert, ist die Windows intelligent genug, um die Dateien zu wissen, bewegen, um einen anderen Ordner im Speicher zwischengespeichert wird)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top