我正在尝试在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毫秒)
答案 0 :(得分:1)
GetTickCount
和System.nanoTime()
使用不同的时间来源。
GetTickCount
的问题是它的分辨率非常差,通常在10毫秒左右。这在文档中明确说明:
GetTickCount函数的分辨率仅限于 系统计时器的分辨率,通常在10的范围内 毫秒到16毫秒。
难怪它与nanoTime
有很大不同。
要使测量与System.nanoTime
保持一致,请拨打QueryPerformanceCounter
或GetSystemTimeAsFileTime
来使用更高分辨率的计时器。
修改强>
JDK的System.nanoTime()
是在QueryPerformanceCounter
(the source)之上实施的。
答案 1 :(得分:0)
在java方面,你将永远受JVM的支配: