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是它的分辨率很差,通常在 10 毫秒左右。这在文档中明确指出:

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

难怪它可以与nanoTime那么多不同。

要使测量结果与 一致,请通过调用或System.nanoTime使用更高分辨率的计时器。QueryPerformanceCounterGetSystemTimeAsFileTime

编辑

JDK是在(source)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 回答