2016-03-21 12 views
3

JNI呼び出しで時間を測定しようとしていますが、ネイティブからJavaを呼び出しています。Java JNIの測定時間(ネイティブコールJava)

Cコードでは、 "GetTickCount" APIを適用してJNI実行時間を取得し、 "System.nano"をJavaで取得します。

例:

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

とJava

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

Javaの期間は、Cの期間を超えているので、時々、それは矛盾しています。 (約5~10ミリ秒)

+0

'GetTickCount'は**ミリ秒**を返し、' System.nanoTimeの() 'を返します**ナノ**秒。 – apangin

+0

ご迷惑をお掛けして申し訳ございません。単位時間には関係しません。私はここに投稿している間、最後の行のコードを見逃しています。実際、私はソースコードでnanoをミリ秒に変換しています:)。 Javaの継続時間は、Cの継続時間よりも同じ単位(ミリ秒)である – LGProgramer

答えて

1

およびSystem.nanoTime()は、異なる時間ソースを使用します。

GetTickCountの問題は解像度が非常に悪く、通常は約10msです。これは、明示的にドキュメントに注目されている:

GetTickCount関数の解像度は16ミリ秒に10 ミリ秒の範囲である、システムタイマーの 解像度に制限されています。

nanoTimeとは多少異なる場合があります。

System.nanoTimeと一貫した測定を行うには、QueryPerformanceCounterまたはGetSystemTimeAsFileTimeのいずれかを呼び出して、より高分解能のタイマーを使用します。

EDIT

JDKのSystem.nanoTime()QueryPerformanceCounter(the source)の上に実装されます。物事のJava側で

+0

ご協力いただきありがとうございます。それは非常に便利です:) – LGProgramer

関連する問題