在 Java JNI 中测量时间(本机调用 Java)
Measure time in Java JNI ( native call Java)
我正在尝试测量 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 毫秒)
GetTickCount
and System.nanoTime()
使用不同的时间源。
GetTickCount
的问题是分辨率很差,通常在 10 毫秒左右。这在文档中明确指出:
The resolution of the GetTickCount function is limited to the
resolution of the system timer, which is typically in the range of 10
milliseconds to 16 milliseconds.
怪不得和nanoTime
差那么多。
要使测量与 System.nanoTime
一致,请通过调用 QueryPerformanceCounter
or GetSystemTimeAsFileTime
.
使用更高分辨率的计时器
编辑
JDK 的 System.nanoTime()
是在 QueryPerformanceCounter
(the source).
之上实现的
在 java 方面,您将始终受制于 JVM:
我正在尝试测量 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 毫秒)
GetTickCount
and System.nanoTime()
使用不同的时间源。
GetTickCount
的问题是分辨率很差,通常在 10 毫秒左右。这在文档中明确指出:
The resolution of the GetTickCount function is limited to the resolution of the system timer, which is typically in the range of 10 milliseconds to 16 milliseconds.
怪不得和nanoTime
差那么多。
要使测量与 System.nanoTime
一致,请通过调用 QueryPerformanceCounter
or GetSystemTimeAsFileTime
.
编辑
JDK 的 System.nanoTime()
是在 QueryPerformanceCounter
(the source).
在 java 方面,您将始终受制于 JVM: