DGL Benchmark: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (getBenchmarkInfos-Methode)
(2. Benchmark Output)
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 112: Zeile 112:
  
  
2. Aufruf von "validateBenchmark" der Benchmark-Klasse.<br>
+
2. Aufruf von "getBenchmarkInfos" der Benchmark-Klasse.<br>
- Falls Rückgabe ungleich "" ist, dann Abbrechen und Ausgabe wie unter 2.3. beschrieben.
+
- Prüfen ob Name und Version enthalten ist. Falls nicht: Abbrechen und Ausgabe wie unter 2.2. beschrieben.<br>
 +
- Prüfen ob Loops angegeben wurde. Falls ja prüfen ob der Wert valide (sonst 50 verwenden).
  
  
3. Aufruf von "getBenchmarkInfos" der Benchmark-Klasse.<br>
+
3. Aufruf von "validateBenchmark" der Benchmark-Klasse.<br>
- Prüfen ob Name und Version enthalten ist. Falls nicht: Abbrechen und Ausgabe wie unter 2.2. beschrieben.<br>
+
- Falls Rückgabe ungleich "" ist, dann Abbrechen und Ausgabe wie unter 2.3. beschrieben.
- Prüfen ob Loops angegeben wurde. Falls ja prüfen ob der Wert valide (sonst 50 verwenden).
 
  
  
Zeile 147: Zeile 147:
  
 
7. Schreiben der Ausgabe wie unter 2.1.
 
7. Schreiben der Ausgabe wie unter 2.1.
 
  
 
====Zeitmessung====
 
====Zeitmessung====
Zeile 161: Zeile 160:
 
  <DGLBENCHMARK>
 
  <DGLBENCHMARK>
 
   <HEADER>
 
   <HEADER>
 +
  <BENCHMARK_NAME>{Der Name wie er in den BenchmarkInfos angegeben ist.}</BENCHMARK_NAME>
 
   <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION>
 
   <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION>
 
   <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE>
 
   <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE>
Zeile 179: Zeile 179:
 
  <DGLBENCHMARK>
 
  <DGLBENCHMARK>
 
   <HEADER>
 
   <HEADER>
 +
  <BENCHMARK_NAME>{Der Name wie er in den BenchmarkInfos angegeben ist.}</BENCHMARK_NAME>
 
   <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION>
 
   <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION>
 
   <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE>
 
   <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE>
Zeile 191: Zeile 192:
 
  <DGLBENCHMARK>
 
  <DGLBENCHMARK>
 
   <HEADER>
 
   <HEADER>
 +
  <BENCHMARK_NAME>{Der Name wie er in den BenchmarkInfos angegeben ist.}</BENCHMARK_NAME>
 
   <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION>
 
   <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION>
 
   <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE>
 
   <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE>

Aktuelle Version vom 9. Januar 2010, 23:10 Uhr

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.


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.
CanvasSize 
Größe des OpenGL-Canvases im Format [Breite]x[Hoehe] in Pixel. Beispiel: 400x300


Mindestens enthalten sein muss der Name des Benchmarks, CanvasSize und die Version.

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 "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).


3. Aufruf von "validateBenchmark" der Benchmark-Klasse.
- Falls Rückgabe ungleich "" ist, dann Abbrechen und Ausgabe wie unter 2.3. beschrieben.


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_NAME>{Der Name wie er in den BenchmarkInfos angegeben ist.}</BENCHMARK_NAME>
  <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_NAME>{Der Name wie er in den BenchmarkInfos angegeben ist.}</BENCHMARK_NAME>
  <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_NAME>{Der Name wie er in den BenchmarkInfos angegeben ist.}</BENCHMARK_NAME>
  <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>