2016-03-21 19 views
3

Ich versuche, Zeit in JNI-Aufruf zu messen, es von nativem Java aufrufen.Messzeit in Java JNI (nativer Aufruf Java)

In C-Code, ich "GetTickCount" API anwenden, um JNI Ausführungszeit und "System.nano" in Java zu erhalten.

Beispiel:

long start = GetTickCount(); 
....//CallStaticMethod exampleMethod... 
long end = GetTickCount(); 
long duration = end - start; 

Und in Java

public static exampleMethod(){ 
    long start = System.nano(); 
    //do something 
    long end = System.nano(); 
    long duration = TimeUnit.NANOSECONDS.toMilis(end - start); 
} 

Manchmal ist es inkonsequent, weil die Dauer des Java mehr als C die Dauer ist. (ungefähr 5 bis 10 Millisekunden)

+0

'GetTickCount' zurück ** Milli ** Sekunden' System.nanoTime() 'Erträge ** Nano ** Sekunden. – apangin

+0

Entschuldigung für Unannehmlichkeiten. Es bezieht sich nicht auf die Zeiteinheit. Ich vermisse den letzten Zeilencode während ich hier posten. Eigentlich konvertiere ich Nano in Millisekunden in meinem Quellcode :). Die Dauer von Java ist mehr als die Dauer von C als die gleiche Einheit (Millisekunden) – LGProgramer

Antwort

1

GetTickCount und System.nanoTime() verschiedene Zeitquellen verwenden.

Das Problem mit GetTickCount ist seine sehr schlechte Auflösung, normalerweise um 10ms. Dies ist explizit in der Dokumentation bemerkt:

Die Auflösung der GetTickCount Funktion ist beschränkt auf die Auflösung des Systemzeitgebers, der typischerweise im Bereich von 10 bis 16 Millisekunden Millisekunden.

Kein Wunder, dass es von nanoTime so viel abweichen kann.

Um Messungen mit System.nanoTime konsistent zu machen, verwenden Sie einen Timer mit höherer Auflösung, indem Sie entweder QueryPerformanceCounter oder GetSystemTimeAsFileTime aufrufen.

EDIT

JDK System.nanoTime() oben auf QueryPerformanceCounter(the source) umgesetzt wird.

+0

Vielen Dank für Ihre Unterstützung. Es ist sehr nützlich :) – LGProgramer