Frage

Da ich weiß nicht, zum Zeitpunkt der Bereitstellung, welche Art von System meines Code auf laufen, wie schreibe ich eine Performance-Benchmark, die das Potenzial eines Systems als Maßstab verwendet.

Was ich meine ist, dass, wenn ein System läuft das Stück Code 1000-mal pro Sekunde fähig ist, ich den Test mag, um sicherzustellen, dass ist kommt unter möglichst nahe an 1000 wie möglich. Wenn es nur 500 tun kann, dann ist das der Preis, den ich mag es vergleichen, gegen.

Wenn es bei der Herstellung der Antwort präziser hilft, ich bin mit JUnit4.

Danke.

War es hilfreich?

Lösung

Ein Test bedeutet, dass Sie einen Pass / Fail-Schwelle. Für einen Leistungstest bedeutet dies, zu langsam und Sie scheitern, schnell genug und Sie passieren. Wenn Sie scheitern, starten Sie Nacharbeit zu tun.

Wenn Sie nicht scheitern, dann bist du Benchmarking, nicht wirklich zu testen.

Wenn Sie darüber reden, „System ist in der Lage zu laufen“ muss man „fähig“ definieren. Sie könnten eine beliebige einer Vielzahl von Hardware-Performance-Benchmarks verwenden. Whetstone, Dhrystone etc., sind sehr beliebt. Oder vielleicht haben Sie eine Datenbank-intensive Anwendung, dann könnten Sie an dem TPC-Benchmark zu suchen. Oder vielleicht haben Sie eine netzwerkintensive Anwendung und wollen netperf verwenden. Oder eine GUI-intensive Anwendung und will eine Art von Grafik-Benchmark verwenden.

Alle diese geben Ihnen eine Art „Fähigkeit“ Messung. Wählen Sie eine oder mehr. Sie sind alle gut. Ebenso fraglich. Ebenso zu Ihrem Konkurrenten voreingenommen und von Ihnen entfernt.

Wenn Sie die Benchmark laufen haben, können Sie dann Ihre Software laufen und sehen, was das System tatsächlich der Fall ist.

Sie können - wenn Sie genügend Daten sammeln - eine gewisse Korrelation zwischen einigen Benchmark-Zahlen und Ihre Leistung Zahlen etablieren. Sie werden alle Arten von Variation sehen, basierend auf Arbeitsbelastung, Hardwarekonfiguration, Betriebssystem-Version, eine virtuelle Maschine, DB-Server, usw.

Mit genügend Daten von genügend Boxen mit genug, um verschiedenen Konfigurationen, werden Sie schließlich in der Lage sein, ein Performance-Modell zu entwickeln, die „angesichts diese Hardware, Software, Tuning-Parameter und Konfiguration sagt erwarte ich, dass meine Software tun [X] Transaktionen pro Sekunde .“ Das ist eine solide Definition von „fähig“.

Wenn Sie dieses Modell haben, können Sie dann Ihre Software gegen die Fähigkeit Nummer vergleichen. Bis Sie ein sehr vollständiges Modell haben, weiß man nicht wirklich, welche Systeme sind sogar in der Lage das Stück Code 1000-mal pro Sekunde ausgeführt wird.

Andere Tipps

Ich würde nicht Unit-Tests für Performance-Tests für eine Reihe von Gründen verwendet werden.

Als erster Unit-Tests sollten keine Abhängigkeiten an den umgebenden System / Code. Performance-Tests hängen stark von der Hardware / O, so ist es schwer, einheitliche Maßnahmen zu erhalten, die auf beiden Entwickler-Workstations nutzbar sein wird, baut Server etc.

Zweitens Unit-Tests sollten wirklich schnell auszuführen. Wenn Sie Performance-Tests zu tun, möchten Sie in der Regel recht große Datenmengen haben und die Anzahl der Durchläufe ein paar Mal, um durchschnittliche Zahlen wiederholen / Overhead loszuwerden und so weiter. Diese arbeiten alle gegen die Idee der schnellen Tests.

Ich stimme mit Brian , wenn er sagt, dass Unit-Tests nicht der geeignete Weg ist, Leistung zu tun Testen . Allerdings habe ich zusammen ein kurzes Beispiel, das als Integrationstest verwendet werden könnte, auf verschiedene Systemkonfigurationen / Umgebungen ausgeführt werden.
Man beachte, dass sie nur eine Vorstellung davon zu geben, was in dieser Hinsicht getan werden könnte, und die Ergebnisse nicht liefern, die präzise genug sind, eine offizielle Aussage über die Leistung eines Systems zu sichern.

import static org.junit.Assert.*;
import org.junit.Test;

package com.stackoverflow.samples.tests {

    @Test
    public void doStuffRuns500TimesPerSecond() {
        long maximumRunningTime = 1000;
        long currentRunningTime = 0;
        int iterations = 0;

        do {
            long startTime = System.getTimeMillis();

            // do stuff

            currentRunningTime += System.getTimeMillis() - startTime;
            iterations++;
        }
        while (currentRunningTime <= maximumRunningTime);

        assertEquals(500, iterations);
    }
}

Ich habe einige Zeit Messungen an Tests für Code, der für ein Echtzeitsystem bestimmt ist, wo eine richtige Antwort, die zu lange gedauert hat, ist ein Fehler zu berechnen.

Alles, was ich tun, ist Plot der Delta-CPU-Zeit, dass der Test über die nahm den letzten Builds. Beachten Sie, dass die CPU-Zeit nicht in Echtzeit. Der tatsächliche Wert spielt keine Rolle, zu viel - was zählt, ist, wie viel es geändert.

Wenn ich eine Änderung an einen Algorithmus begehen, die wesentlich die Laufzeit für den Test änderte es einfach an die jeweiligen changeset vergrößern kann, die sie verursacht hat. Was ich wirklich über diese Punkte von Interesse - nicht unbedingt die absoluten Werte. Es gibt oft viele Kompromisse in einem Echtzeit-System und kann diese nicht immer auf die Test-Framework dargestellt wird als einfacher vergleichen.

in absoluten Zeiten der Suche und Normalisierung sie zunächst sinnvoll erscheint, aber die Umwandlung zwischen Ihrem System in der Realität und das Zielsystem wird nicht linear sein - zum Beispiel Cache-Druck, Swap-Nutzung, Plattengeschwindigkeit auf dem Zielsystem usw. verursachen kann die Zeit für den Test an einer anderen Schwelle als Ihr System zu explodieren.

Wenn Sie unbedingt einen Test müssen die in dieser Hinsicht, duplizieren Sie das Zielsystem korrekt ist und es als Test-Slave verwenden, aber in einer ähnlichen Umgebung, wie Sie es erwarten sein.

In meinem Fall kann es tatsächlich sein Herunterladen von Firmware auf einem DSP, fern powercycling es, das Lesen der Antwort von einem seriellen Port oder sehen keine Antwort, weil es! Abgestürzt

- jeffk ++

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