Diskussion:DGL Benchmark: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (So... jetzt sieht's halbwegs vertretbar aus :))
K (Hab ein bisschen Javadoc drangeklebt.)
 
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 8: Zeile 8:
 
<source lang="C">// String Encoding: UTF-8
 
<source lang="C">// String Encoding: UTF-8
  
void execute(String benchmarkName); // Benchmark-Methode
+
void execute(char* benchmarkName); // Benchmark-Methode
  
String getName(); // Benchmark-Name
+
char* getName(); // Benchmark-Name
 
int getCanvasWidth();
 
int getCanvasWidth();
 
int getCanvasHeight();
 
int getCanvasHeight();
String getVersion();
+
char* getVersion();
  
Array[String] getProperties(); // getBenchmarkInfos-Methode
+
char** getProperties(); // getBenchmarkInfos-Methode
  
String checkRuntimeEnvironment(); // Validate-Methode
+
char* checkRuntimeEnvironment(); // Validate-Methode
void setup(String benchmarkName); // Setup-Methode
+
void setup(char* benchmarkName); // Setup-Methode
  
Array[String] getAvailableBenchmarks(); // Liste der Implementationsvarianten</source>
+
char** getAvailableBenchmarks(); // Liste der Implementationsvarianten</source>
  
  
Zeile 36: Zeile 36:
  
 
~ Frase (22:09 Uhr, 25. April 2010) (Und ja, ich mag keine WikiSyntax)
 
~ Frase (22:09 Uhr, 25. April 2010) (Und ja, ich mag keine WikiSyntax)
 +
 +
----
 +
 +
So, habe mal ne Java-Anbindung dafür gebastelt:
 +
<source lang="Java">package com.delphigl.benchmark;
 +
 +
import static java.lang.System.out;
 +
 +
import com.sun.jna.Library;
 +
import com.sun.jna.Native;
 +
 +
/**
 +
* Demonstrates the acces from within Java to C libraries.
 +
* <p>
 +
* You can feed it a library's name as the first argument. Otherwise it takes the library named
 +
* "benchmark". Be it either .so (on unix) or .dll (on windows).
 +
*
 +
* @author Frase
 +
*/
 +
public class Binding {
 +
    public static void main(String[] args) {
 +
        final String libName;
 +
        if (args.length > 0) {
 +
            libName = args[0];
 +
        } else {
 +
            libName = "benchmark";
 +
        }
 +
        Benchmark benchmark = (Benchmark) Native.loadLibrary(libName, Benchmark.class);
 +
        out.println(String.format("The benchmark's name is: '%s'", benchmark.getName()));
 +
    }
 +
}
 +
 +
interface Benchmark extends Library {
 +
    // String Encoding: UTF-8 (No - not really. In fact it is currently any
 +
    // 1-byte encoding ^^)
 +
 +
    void execute(String benchmarkName); // Benchmark-Methode
 +
 +
    String getName(); // Benchmark-Name
 +
    int getCanvasWidth();
 +
    int getCanvasHeight();
 +
    String getVersion();
 +
 +
    String[] getProperties(); // getBenchmarkInfos-Methode
 +
 +
    String checkRuntimeEnvironment(); // Validate-Methode
 +
    void setup(String benchmarkName); // Setup-Methode
 +
   
 +
    String[] getAvailableBenchmarks(); // Liste der Implementationsvarianten
 +
}</source>
 +
 +
 +
Viel Spaß damit :)
 +
 +
 +
~ Frase (Zeit wie oben... so in etwa)

Aktuelle Version vom 25. April 2010, 21:39 Uhr

Anmerkungen Habe nen Änderungsvorschlag für das Interface. Wie im Chat am 25. April (ergo: heute) gegen Ende angesprochen, plädiere ich für ein reines C-Interface der Einfachheit halber. Flash meinte, ich könne mich dann ja gleich mal darum kümmern, wie das auszusehen hat und was in Java basteln, was den Spaß lädt.

Das Interface könnte imho so aussehen:


// String Encoding: UTF-8

void execute(char* benchmarkName); // Benchmark-Methode

char* getName(); // Benchmark-Name
int getCanvasWidth();
int getCanvasHeight();
char* getVersion();

char** getProperties(); // getBenchmarkInfos-Methode

char* checkRuntimeEnvironment(); // Validate-Methode
void setup(char* benchmarkName); // Setup-Methode

char** getAvailableBenchmarks(); // Liste der Implementationsvarianten


Darin sind alle auf der Wiki-Seite geforderten Informationen enthalten - es ist jedoch leicht anders strukturiert. Der Einfachheit halber sind alle notwendigen Informationen (Also alles, was der Benchmark dem Framework zur Verfügung stellen _muss_) als Funktionen aufgeführt, die implementiert werden _müssen_, sonst wird mit dem Hinweis, dass das Interface nicht korrekt implementiert worde aufgrund von XYZ abgebrochen (bzw. ein entsprechendes XML-Schnippsel ausgegeben) - wie auch immer. Alle optionalen Sachen finden sich in "getProperties", was ein Array von Strings zurückliefert. Diese sind im Format "key=value". Das altbekannte INI-Format (in Java besser bekannt als Properties).


Die Größe vom Canvas wird typsicher als ints zurückgegeben anstatt untypisiert als Strings.


Und anstatt mit Reflection herumzuhantieren und die Methodennamen zu erraten, würde ich die einzelnen benchmarks schlicht und ergreifend als Parameter mitgeben ("benchmarkName" hab ich's mal genannt). Ist imho wesentlich einfacher ;)

Das war's soweit erstmal... Habe das als Diskussion angehängt, weil es doch einige Änderungen gegenüber der Version auf der Wiki-Seite hat und ich keine Lust hab, die komplett umzunudeln ;)


~ Frase (22:09 Uhr, 25. April 2010) (Und ja, ich mag keine WikiSyntax)


So, habe mal ne Java-Anbindung dafür gebastelt:

package com.delphigl.benchmark;

import static java.lang.System.out;

import com.sun.jna.Library;
import com.sun.jna.Native;

/**
 * Demonstrates the acces from within Java to C libraries.
 * <p>
 * You can feed it a library's name as the first argument. Otherwise it takes the library named
 * "benchmark". Be it either .so (on unix) or .dll (on windows).
 * 
 * @author Frase
 */
public class Binding {
    public static void main(String[] args) {
        final String libName;
        if (args.length > 0) {
            libName = args[0];
        } else {
            libName = "benchmark";
        }
        Benchmark benchmark = (Benchmark) Native.loadLibrary(libName, Benchmark.class);
        out.println(String.format("The benchmark's name is: '%s'", benchmark.getName()));
    }
}

interface Benchmark extends Library {
    // String Encoding: UTF-8 (No - not really. In fact it is currently any
    // 1-byte encoding ^^)

    void execute(String benchmarkName); // Benchmark-Methode

    String getName(); // Benchmark-Name
    int getCanvasWidth();
    int getCanvasHeight();
    String getVersion();

    String[] getProperties(); // getBenchmarkInfos-Methode

    String checkRuntimeEnvironment(); // Validate-Methode
    void setup(String benchmarkName); // Setup-Methode
    
    String[] getAvailableBenchmarks(); // Liste der Implementationsvarianten
}


Viel Spaß damit :)


~ Frase (Zeit wie oben... so in etwa)