So debuggen Sie die Leistung Ihrer Anwendung

0
148

Die Anwendungsleistung kann für viele Unternehmen ein kritisches Thema sein. Schließlich wirken sich die Serverhosting-Kosten direkt auf Ihr Endergebnis aus. Wenn Sie also ein Performance-Profiling-Tool zum Debuggen des von Ihnen ausgeführten Codes verwenden, können Sie am Ende Geld sparen.

Auf welche Probleme Sie achten sollten

Ein “Flaschenhals” ist ein langsamer Abschnitt Ihrer App, der den Rest des ansonsten schnelleren Codes verlangsamt, ähnlich wie der Verschluss einer Wasserflasche oder eine enge Straße, die den Verkehr behindert. Jeder Code, den Sie schreiben, hat wahrscheinlich irgendwo Engpässe, und ob sie groß oder klein sind, Sie können Leistungsprofilierungstools verwenden, um sie zu identifizieren.

Jedes Programm ist anders, aber viele Anwendungen leiden darunter viele der gleichen Probleme:

  • Zu oft aufgerufene Funktionen (wo Caching oder Scheduling die Anzahl der Aufrufe reduzieren würde)
  • IO-Blockierungscode, normalerweise synchroner Plattenzugriff, aber auch übermäßiger Speicherverbrauch.
  • Große Schleifen mit kostspieligen Methoden.
  • Lange Startzeiten, insbesondere in JIT-kompilierten Sprachen.
  • Unnötige Speicherzuweisungen, insbesondere in Laufzeiten mit einem Garbage Collector.
  • Bereiche, die von Parallelisierung oder asynchroner Programmierung profitieren würden.

Achten Sie bei der Überprüfung Ihres Codes mit dem Profiler auf diese Aspekte. Selbst wenn Ihre App keinen ernsthaften, offensichtlichen Engpass hat, hilft jeder Prozentsatz der Verbesserung, dass Ihre App schneller und effizienter läuft. p>

Es besteht auch die Möglichkeit, dass Ihre App nicht durch den auf dem Server ausgeführten Code, sondern durch ihren Platz in Ihrem gesamten Netzwerk einen Engpass hat. Wenn Sie beispielsweise eine API-Anwendung haben, die eine Verbindung zu einer langsamen Datenbank herstellt, spielt es keine Rolle, wie schnell der Webserver ist, da er immer auf langsame Ergebnisse wartet. Leistungsprofiler helfen Ihnen nur beim Debuggen von Problemen in Ihrem Code, nicht in Ihrer gesamten Netzwerkarchitektur.

Wie funktioniert Profiling?

Tools zur Leistungsprofilerstellung unterscheiden sich in einigen Punkten von Debugging-Tools. Debugging-Tools wie Breakpoints und Inspektion werden von IDEs zum Testen und zur Problemlösung in der Entwicklung verwendet. Profiler gehen normalerweise davon aus, dass Sie das Problem nicht kennen und Ihren gesamten Code profilieren möchten, um es zu finden. Der Profiler bindet sich in Ihre Anwendung ein und verwendet einen hochpräzisen Timer, um zu verfolgen, welche Funktionen am längsten dauern. Nach einer Weile haben Sie genügend Daten, um herauszufinden, was das Problem verursacht.

Werbung

Die meisten Profiler präsentieren die Daten in einem Stapel, sortiert nach den häufigsten Benutzern . Ein gängiges Diagramm in den meisten Profilern ist das Flammendiagramm, das eine intuitive Aufschlüsselung des gesamten Anrufverlaufs des Programms anzeigt.

Das genaue Tool und die Methode, die Sie verwenden, hängt davon ab, für welche Sprache oder Laufzeit Sie ein Profil erstellen und ob Sie Anwendungen in Produktionsumgebungen profilieren müssen, aber die Grundidee ist dieselbe.

Da jeder Profiler Integrationen mit dem ausgeführten Code haben muss, müssen Sie einen Profiler für die Sprache herunterladen, die Ihre Anwendung verwendet. Einige sind einfacher zu verwenden als andere, insbesondere für Sprachen wie C# und Java, bei denen es einfacher ist, in die Anwendung einzufügen als eine kompilierte Sprache.

Viele IDEs verfügen über integrierte Profilerstellungstools zusätzlich zum Standard-Debugging-Toolset, das Sie ebenfalls verwenden können. Visual Studio kann beispielsweise die Leistung und Speichernutzung in vielen Apps profilieren.

  • Java – JProfiler, IDEA/Eclipse/Netbeans-IDEs
  • Python – cProfiler, Palanteer
  • JavaScript – Chrome DevTools
  • C# – dotTrace, Visual Studio-IDE
  • C, C++ – Umlaufbahn 

Wenn Sie eine Vorstellung davon haben, was eine Weile dauern könnte, können Sie jederzeit eine Stoppuhr-Timer-Bibliothek verwenden, um Benchmarks auszuführen.

Werbung

Benchmark.NET kann beispielsweise Tests für verschiedene Funktionen mit sehr hoher Genauigkeit ausführen und wird häufig verwendet, um verschiedene Algorithmen miteinander zu vergleichen. Sie können auch eine einfache Stoppuhr verwenden, die den zu vergleichenden Code umgibt.

Verwenden eines Leistungsprofilers

In diesem Handbuch zeigen wir Ihnen, wie Sie dotTrace verwenden, einen Leistungsprofiler für .NET-Anwendungen, der mit allen Funktionen ausgestattet ist und die meisten Tools enthält, die in anderen Profilern zu finden sind. Wenn Sie kein Profil für C#-Code erstellen, verwenden Sie wahrscheinlich eine andere Anwendung, aber der Gesamtprozess sollte ähnlich sein.

Sobald Sie die App öffnen, können Sie eine Verbindung zu laufenden .NET-Prozessen herstellen oder Ihre eigene Ausführungskonfiguration einrichten, damit Sie die App über dotTrace starten können. Das Starten der App über den Profiler kann besonders nützlich sein, um langsame Startzeiten zu beheben.

Sobald Sie die App ausführen, beginnt sie mit dem Sammeln von Daten. Sie können es so lange ausführen, wie Sie möchten, drücken Sie einfach “Get Snapshot and Wait” um die Analyse für den erfassten Zeitraum zu öffnen.

Sobald es geöffnet ist, sehen Sie neben der Aufrufliste und der Aufrufstruktur viele Grafiken, die wahrscheinlich unleserlich aussehen. Wenn Sie viele Dinge im Zusammenhang mit Threading, Sperren und Warten sehen, liegt das wahrscheinlich daran, dass Sie den Bereich auf den “Hauptthread”

Der Profiler nimmt alle Threads auf, die oft für Hintergrundaufgaben verwendet werden, die lange Zeit warten. Dies kann zwar ein Hinweis auf IO-Blockierungsprobleme sein, ist jedoch etwas nuancierter, als der Profiler es vermuten lässt, und es hängt wirklich davon ab, was der Thread tut.

dotTrace verfügt auch über eine Funktion zum Filtern von Code basierend auf dem Arbeitsbereich, aus dem er stammt, mit dem &#8220 ;Subsysteme” Filter auf der linken Seite. Es kann nach Systemcode, nativem Code und anderen verzögerten Bereichen wie Reflection, Collections, Strings und LINQ gesucht werden.

Werbung

Im Hauptfenster finden Sie das Flammendiagramm. Hier wird die Aufschlüsselung Ihrer gesamten Anwendung angezeigt, beginnend mit “Alle Anrufe” und Aufschlüsseln der Zeit, die für die Ausführung jeder Funktionsebene benötigt wird. Einige werden nicht aufgelöst und andere sind zu klein, um sie hier anzuzeigen, aber dieses Diagramm kann auf jede Funktion vergrößert werden, um eine genauere Aufschlüsselung für diesen Aufrufstapel anzuzeigen.

Ein weiteres wichtiges Merkmal von Leistungsprofilern ist der Aufrufbaum, der eine verschachtelte Aufschlüsselung der aktivsten Funktionen nach Zeit sortiert anzeigt es braucht sie, um sie auszuführen. Hier zeigt dotTrace auch einen Prozentsatz an, der den Anteil der Gesamtzeit darstellt, den eine bestimmte Funktion und ihre Kinder in Anspruch nahmen.

CPU-Zeit, die für Funktionen aufgewendet wird, ist nicht immer das Problem, insbesondere bei einer Sprache wie C# mit einem Garbage Collector. dotTrace verfolgt auch die Speichernutzung und -zuweisungen und kann verwendet werden, um herauszufinden, was unnötigen Druck auf Ihren GC ausübt.