Ich entwickle Software in C # /. NET, aber ich denke, die Frage kann auch nach anderen Programmiersprachen gestellt werden. Wie testen Sie die Leistung Ihrer Software zwischen den Release-Versionen? Lassen Sie mich noch etwas näher ausführen.
Vor der Produktionsfreigabe der Software möchte ich die Leistung der Software für eine Reihe von Funktionen vergleichen, die in früheren Versionen der Software verfügbar waren. Angenommen, Sie sprechen von einem Softwarebibliotheksprojekt (keine GUI), das zur Veröffentlichung einer oder mehrerer DLLs führt. Wie würde man das erreichen? Was sind einige der besten Praktiken? Ich kann unmöglich die aktuelle DLL mit der vorherigen Release-DLL austauschen und denselben Test ausführen.
Eine Möglichkeit, an die ich denken kann, besteht darin, den gleichen Leistungstest im Hauptzweig (der für die aktuelle Version verwendet wird) und dem früheren Versionszweig hinzuzufügen und dann die Leistung zu vergleichen. Ich denke, dass dies mit einigen Schmerzen verbunden ist, aber es ist möglich.
Eine andere Möglichkeit, an die ich denken kann, ist, mit dem letzten Release Branch zu beginnen, die neuen Codes und Features auszugeben, die nach der letzten Version eingefügt wurden, und dann den Test auszuführen. Ich glaube nicht, dass dies zu einem korrekten Ergebnis führen würde, ganz zu schweigen davon, dass dieser Ansatz noch schmerzhafter ist als der vorherige Ansatz.
Danke für andere Ideen. Würden C # / .NET spezifische Antworten bevorzugen.
Bearbeiten Sie 1: Dies und dies sind etwas verwandte Fragen.
Wir haben eine Reihe von Leistungstests. Dies sind nur NUnit-Tests. Jeder Test richtet einige Objekte ein, startet einen Timer (Stoppuhr funktioniert gut), führt die Operation durch, an der wir interessiert sind (z. B. Laden der Daten für einen bestimmten Bildschirm), und schreibt dann die verstrichene Zeit in eine CSV-Datei. (NUnit protokolliert, wie lange jeder Test dauert, aber wir wollen die Setup-Logik ausschließen, die in einigen Fällen von Test zu Test variiert. Daher ist es sinnvoller, unsere eigenen Timer und Logging zu verwenden.)
Wir führen diese Tests von Zeit zu Zeit immer auf derselben Hardware- und Netzwerkumgebung durch. Wir importieren die Ergebnisse in eine Datenbank. Dann ist es einfach, Diagramme zu erstellen, die Trends zeigen oder große prozentuale Änderungen aufrufen.
Wenn Sie die Performance zwischen Releases tatsächlich vergleichen möchten, benötigen Sie einen Test, der die gleichen Funktionen über die Releases hinweg ausführt. Unit-Tests funktionieren dafür oft gut.
Eine weitere aktive Sache, die Sie tun können, ist, Ihren Code mit Protokollierung basierend auf vordefinierten Leistungsschwellen zu instrumentieren. Wenn Sie beispielsweise Code in einer alten Version ausführen, erhalten Sie eine Metrik. Fügen Sie Ihrer Anwendung Timing-Code hinzu. Wenn dieselbe Funktion zu einem bestimmten Zeitpunkt länger dauert, protokollieren Sie eine Nachricht (oder senden Sie ein Ereignis, das der Aufrufer optional protokollieren kann). Natürlich möchten Sie dies nicht so weit übertreiben, dass der Timing-Code selbst zu einer Leistungsverschlechterung führen könnte.
Wir machen das in unseren Anwendungen mit SQL-Aufrufen. Wir haben einen Grenzwert für die maximale Zeit, die ein einzelner SQL-Aufruf dauern sollte, und wenn ein SQL-Aufruf über dem Schwellenwert liegt, protokollieren wir ihn als Warnung. Wir verfolgen auch die Anzahl der SQL-Aufrufe in einer bestimmten HTTP-Anfrage mit der gleichen Sache. Ihr Ziel sollte es sein, die Schwellenwerte im Laufe der Zeit zu reduzieren.
Sie können diese Tests in #if
Abschnitte einschließen, um sie nicht in die Produktion aufzunehmen, aber es kann auch sehr nützlich sein, diese in der Produktion zu haben.
Sie können die Testergebnisse für jede neue Version an eine quellkontrollierte Textdatei anhängen. Das würde Ihnen eine leicht zugängliche Geschichte der Leistung jeder Version geben.
Ihre Idee, den Leistungstest gegen Zweig und Stamm auszuführen, ist im Wesentlichen derselbe, aber das Speichern der Ergebnisse würde Ihnen wahrscheinlich den Aufwand ersparen, Ihre Arbeitskopie hin und her zu wechseln.
Wir haben eine spezielle Einstellung, die ein Benutzer (oder Tester) aktivieren kann. Wir aktivieren es, es erzeugt eine CSV-Datei, die wir in ein Excel einspeisen und den Leistungsbericht sehen können.
Es wird individuelle Zählungen bestimmter Operationen und deren Dauer protokolliert. Excel zeigt dies auf eine schöne visuelle Weise für uns.
Der gesamte Code ist benutzerdefiniert. Einziger Nachteil ist der Overhead des Performance-Tracking-Codes, aber wir haben ihn getestet und es ist praktisch nichts. Es ist ein gut optimiert und sehr kurz.
Schönheit dieses Ansatzes ist auch, dass Sie gutes Feedback von Kunden erhalten können, wenn sie Leistungsprobleme haben, die Sie nicht reproduzieren können.
Tags und Links .net c# performance