3

JNI 呼び出しの時間を測定しようとしています。ネイティブから Java への呼び出しです。

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

例:

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ミリ秒)

4

2 に答える 2

2

GetTickCountSystem.nanoTime()異なる時間ソースを使用します。

問題GetTickCountは解像度が非常に低く、通常は約 10ms です。これは、ドキュメントで明示的に指摘されています。

GetTickCount 関数の分解能は、システム タイマーの分解能に制限されており、通常は 10 ミリ秒から 16 ミリ秒の範囲です。

そこまで差が出ても不思議ではありませんnanoTime

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

編集

JDKは(ソース) のSystem.nanoTime()上に実装されています。QueryPerformanceCounter

于 2016-03-21T14:10:54.253 に答える
0

Java 側では、常に JVM に翻弄されます。

http://shipilev.net/blog/2014/nanotrusting-nanotime/

于 2016-03-21T14:27:27.837 に答える