在Java JNI(Java本地调用)中衡量时间

3

我试图在JNI调用中测量时间,它从本地调用到Java。

在C代码中,我使用"GetTickCount" api获取JNI执行时间,在Java中使用"System.nanoTime"。

示例:

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毫秒)


GetTickCount 返回毫秒System.nanoTime() 返回纳秒 - apangin
抱歉给您带来不便。这与单位时间无关。我在发布时错过了最后一行代码。实际上,我在源代码中将纳秒转换为毫秒:)。Java的持续时间比C的持续时间更长,作为相同的单位(毫秒)。 - LGProgramer
2个回答

2

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

GetTickCount 的问题在于其分辨率非常低,通常约为10毫秒。这在文档中明确说明:

GetTickCount函数的分辨率受系统计时器的限制,该计时器的分辨率通常在10毫秒到16毫秒之间。

难怪它与 nanoTime 有如此大的差异。

为了使测量结果与 System.nanoTime 一致,请通过调用 QueryPerformanceCounterGetSystemTimeAsFileTime 来使用更高分辨率的定时器。

编辑

JDK 的 System.nanoTime() 是基于 QueryPerformanceCounter 实现的 (源代码)


感谢您的支持。这非常有用 :) - LGProgramer

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接