DGL Benchmark
Vorwort Diese Spezifikation beschreibt nur die für den Benchmark relevanten Teile. Wie die grafische Ausgabe initialisiert wird ist den Programmierern überlassen. Ebenso wie der Benchmark-Code eingebunden wird (neukompilieren des Programms oder dynamisches Laden z.B. durch Java-Reflection) oder ob und wie eine GUI/Menü benötigt wird.
Inhaltsverzeichnis
Spezifikation - DGL Benchmark
Dieses Dokument beschreibt die Fähigkeiten und den generellen Aufbau des Programms DGL Benchmark. Das Programm erstellt Ausgaben in einer definierten Form, welche es ermöglichen Performancemessungen von 1. alternativen Implementierungen in der selben Umgebung 2. identische Implementierungen in verschiedenen Umgebungen zu vergleichen.
1. Aufbau des Programms
Das Programm besteht aus einem Kern sowie dem Benchmark-Code.
1.1. Benchmark-Code
Benchmark Klasse
Jeder Benchmark wird durch genau eine Benchmark-Klasse abgebildet. Der Benchmark Code befindet sich komplett in dieser Klasse. Diese Benchmark Klasse wiederum befindet sich in einem eigenen Sourcecode-File (z.B. *.pas, *.java, *.cpp+*.h).
Benchmark Zweck
Jede Benchmark Klasse dient nur genau einem Benchmark-Zweck.
- Beispiel
- "Überprüfung der Performance der standard OpenGL Shading Methoden (Flat, Smooth)."
Für den Benchmark Zweck gibt es üblicherweise mindestends zwei alternative Implementationsvarianten. Im Beispiel oben eine mit Flat-Shading und eine mit Smooth-Shading.
Benchmark-Methode
INPUT: keiner
OUTPUT: keiner
Jede Implementationsvariante des Benchmark-Zwecks wird in einer eigenen öffentlichen Methode der Benchmark Klasse implementiert. Diese Methoden werden einheitlich mit dem präfix "benchmark_" benannt. Es muss in jeder Benchmark-Klasse mindestens eine Benchmark-Methode vorhanden sein.
Validate-Methode
INPUT: keiner
OUTPUT: Ein leerer String ("") im Erfolgsfall oder aber eine Beschreibung wieso die Validierung fehlschlug.
Die Validate Methode wird einmalig und vor dem Aufruf der ersten Setup-Methode aufgerufen.
Die Validate Methode prüft ob die benötigte mindest-OpenGL-Version vorhanden ist bzw. ob alle benötigten OpenGL Extensions, die der Benchmark benötigt, verfügbar sind. Ist dies nicht der Fall liefert die Funktion eine Beschreibung des Problems (z.B. den Namen der fehlenden Extension) zurück.
Die Validate Methode ist öffentlich und wird mit "validateBenchmark" bezeichnet.
Setup-Methoden
INPUT: keiner
OUTPUT: keiner
Die SetUp Methode ändert immer alle OpenGL Eigenschaften in die für den Benchmark benötigten Werte.
Für jede Benchmark Methode muss eine SetUp Methode existieren. Wird kein SetUp benötigt, kann die Methode leer bleiben.
Die entsprechende SetUp Methode wird vor jedem Aufruf der zugehörigen Benchmark-Methode aufgerufen.
Die Setup-Methode ist öffentlich und wird einheitlich mit dem Namen "setupBenchmark_BENCHMARKNAME" bezeichnet.
- Beispiel
- Für die Benchmark Methode "benchmark_StdShadingSpeed" muss eine Setup Methode namens "setupBenchmark_StdShadingSpeed" existieren.
getBenchmarkInfos-Methode
INPUT: keiner
OUTPUT: Ein formatierter String mit Informationen über den Benchmark. Der String enthält Zeilenumbrüche. Jede Zeile enthält genau einen Datensatz im Format "BEZEICHNER=WERT". Folgende Bezeichner sind vorgesehen
- Name
- Der Benchmarkname. Sollte eindeutig sein.
z.B. durch das Vorranstellen des DGL-Usernamen (z.B. Flash.ShadingBenchmark) - Autor
- Der/Die Autor(en)
- Version
- Version des Vorliegenden Benchmarks.
(Die Version ist eine Ganzzahl beginnend bei 1 . Die Version eines Benchmarks wird immer dann um 1 erhöht, wenn eine Änderung am Code durchgeführt wurde die eine Performanceänderung einer der Benchmark-Methoden nach sich ziehen könnte.) - Zweck
- Der Benchmarkzweck
- Loops
- Anzahl der Wiederholungen die zur Messung gemacht werden sollen. Dient als Parameter für das Benchmark-Programm. Ganzzahliger Wert. Ist dies nicht angegeben wird 50 als Standardwert genutzt. Wertebereich: 0 < Loops <= 1000.
Mindestens enthalten sein muss der Name des Benchmarks, sowie die Version.
- CanvasSize
- Größe des OpenGL-Canvases im Format [Breite]x[Hoehe] in Pixel. Beispiel: 400x300
Die Info-Methode wird einheitlich mit dem Namen "getBenchmarkInfos" bezeichnet und ist öffentlich. Jede Benchmark-Klasse muss genau eine Info-Methode besitzen.
1.2. Programm-Kern
Der Programm-Kern steuert den Benchmark Ablauf, den Aufruf des Benchmark-Codes sowie die Erstellung der Benchmark Ausgaben (siehe "2. Benchmark Output").
Vorbereitung
Das Benchmarkprogramm muss für jeden Benchmark derart vorbereitet werden, dass der Benchmark-Code, welcher nicht Teil des Kernes ist, in diesem verfügbar ist. Falls keine geeigneteren Möglichkeiten zur Verfügung stehen, kann dies dadurch geschehen, dass der Programmierer des Benchmark-Codes den Sourcecode des "DGL Benchmark" Programms nimmt und dort die Einbindung manuell durchführt, neu kompiliert und den Benchmark dann zur Verfügung stellt.
Benchmark Prozess
Der Benchmarkprozess:
1. Validieren der Struktur der Benchmark-Klasse
- Sind alle Funktionen korrekt benannt? Existieren alle benötigten Setup Methoden? etc.
- Falls nicht: Abbrechen und Ausgabe wie unter 2.2. beschrieben.
2. Aufruf von "validateBenchmark" der Benchmark-Klasse.
- Falls Rückgabe ungleich "" ist, dann Abbrechen und Ausgabe wie unter 2.3. beschrieben.
3. Aufruf von "getBenchmarkInfos" der Benchmark-Klasse.
- Prüfen ob Name und Version enthalten ist. Falls nicht: Abbrechen und Ausgabe wie unter 2.2. beschrieben.
- Prüfen ob Loops angegeben wurde. Falls ja prüfen ob der Wert valide (sonst 50 verwenden).
4. Für jede Implementationsveriante (Benchmark-Methode) wird eine Liste für die Messwerte erstellt.
5. START DES BENCHMARKS (Schleifenbeging (von 1 bis Loops))
5.1. "setupBenchmark_BENCHMARKNAME"
5.2. starten der Zeitmessung
5.3. Aufruf der Benchmark-Methode benchmark_BENCHMARKNAME
5.4. stoppen der Zeitmessung
5.5. speichern des gemessenen Zeit in dafür erstellen Liste (siehe Schritt 4)
5.1.-5.5. für die anderen Benchmark-Methoden
ES WERDEN PRO SCHLEIFENDURCHLAUF IMMER ALLE BENCHMARK-FUNKTIONEN AUSGEFÜHRT.
Beispiel RICHTIG: Loops = 5; 2 Benchmarkfunktionen; resultierende Reihenfolge: B1B2 B1B2 B1B2 B1B2 B1B2
Beispiel FALSCH : Loops = 5; 2 Benchmarkfunktionen; resultierende Reihenfolge: B1B1B1B1B1 B2B2B2B2B2
6. Berechnen der Werte für jede Benchmark-Methode mit Hilfe der gespeicherten Werte
Berechnet werden
- durchschnittliche Ausführungsdauer des Codes (<AVERAGE_TIME>)
- daraus resultierende theoretische Framezahl (<AVERAGE_FRAMES>)
- Standardabweichung (<STD_DEVIATION>)
7. Schreiben der Ausgabe wie unter 2.1.
Zeitmessung
Zwischen Beginn und Ende der Zeitmessung darf Nichts außer dem Aufruf der aktuell gemessenen Benchmark-Methode stehen. Zur Zeitmessung wird die genaueste Verfügbare Technik eingesetzt.
2. Benchmark Output
Die Ausgabe des Benchmarks erfolgt im XML Format. Ziel ist es die Daten in einem Zweiten Schritt in einer zentralen Datenbasis automatisch einzulesen um darüber Auswertungen erstellen zu können.
2.1. Ausgabe im Erfolgsfall
<DGLBENCHMARK> <HEADER> <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION> <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE> <LOOPS>{Anzahl Loops}</LOOPS> </HEADER> <IMPLEMENTATION name="{Benchmark-Methoden-Name}"> <AVERAGE_TIME>{Durchschnittliche Zeit}</AVERAGE_TIME> <AVERAGE_FRAMES>{Aus der durschn. Zeit berechnete Theoretische Framezahl}</AVERAGE_FRAMES> <STD_DEVIATION>{Standardabweichung der Werte}</STD_DEVIATION> </IMPLEMENTATION> <IMPLEMENTATION ... </DGLBENCHMARK>
2.2. Ausgabe wenn Benchmark-Klasse nicht den Vorgaben entspricht
<DGLBENCHMARK> <HEADER> <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION> <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE> <LOOPS>{Anzahl Loops}</LOOPS> </HEADER> <ERROR type="INVALID_BENCHMARK_STRUCTURE"> {Wenn möglich detailierte Beschreibung was falsch ist, sonst leer.} </ERROR> </DGLBENCHMARK>
2.3. Ausgabe wenn Benchmark-Vorraussetzungen am aktuellen System nicht erfüllt sind
<DGLBENCHMARK> <HEADER> <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION> <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE> <LOOPS>{Anzahl Loops}</LOOPS> </HEADER> <ERROR type="BENCHMARK_REQUIREMENTS_NOT_MET"> {Wenn möglich detailierte Beschreibung was fehlt, sonst leer.} </ERROR> </DGLBENCHMARK>