在Java JNI中测量时间(本机调用Java)

时间:2016-03-21 09:09:36

标签: java performance java-native-interface measure elapsedtime

我正在尝试在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毫秒)

2 个答案:

答案 0 :(得分:1)

GetTickCountSystem.nanoTime()使用不同的时间来源。

GetTickCount的问题是它的分辨率非常差,通常在10毫秒左右。这在文档中明确说明:

  

GetTickCount函数的分辨率仅限于   系统计时器的分辨率,通常在10的范围内   毫秒到16毫秒。

难怪它与nanoTime有很大不同。

要使测量与System.nanoTime保持一致,请拨打QueryPerformanceCounterGetSystemTimeAsFileTime来使用更高分辨率的计时器。

修改

JDK的System.nanoTime()是在QueryPerformanceCounter (the source)之上实施的。

答案 1 :(得分:0)

在java方面,你将永远受JVM的支配:

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