2016-03-21 1 views
3

J'essaie de mesurer le temps dans l'appel JNI, il appelle du natif à Java.Mesurer le temps en Java JNI (appel natif Java)

En code C, j'applique l'API "GetTickCount" pour obtenir le temps d'exécution JNI et "System.nano" en Java.

Exemple:

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

Et en Java

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

Parfois, il est incompatible parce que la durée de la java est plus que la durée C. (environ 5 à 10 millisecondes)

+0

'GetTickCount' retourne ** milli secondes **, elle retourne' System.nanoTime (') ** nano ** secondes. – apangin

+0

Désolé pour dérangement. Ce n'est pas lié à l'heure de l'unité. Le dernier code de ligne me manque pendant que je poste ici. En fait, je convertis nano en milisecondes dans mon code source :). La durée de Java est supérieure à la durée de C sous la même unité (milisecondes) – LGProgramer

Répondre

1

GetTickCount et System.nanoTime() d'utiliser différentes sources de temps.

Le problème avec GetTickCount est sa très mauvaise résolution, généralement autour de 10ms. Ceci est fait remarquer explicitement dans la documentation:

La résolution de la fonction GetTickCount est limitée à la résolution de la minuterie du système, qui est généralement de l'ordre de 10 millisecondes à 16 millisecondes.

Il n'est pas étonnant qu'il puisse différer autant de nanoTime.

Pour effectuer des mesures cohérentes avec System.nanoTime, utilisez un temporisateur à résolution plus élevée en appelant QueryPerformanceCounter ou GetSystemTimeAsFileTime.

EDIT

JDK System.nanoTime() est mis en œuvre sur le dessus de QueryPerformanceCounter(the source).

+0

Merci de votre soutien. C'est très utile :) – LGProgramer