早上好,
我需要获取CPU高分辨率性能计数器的值,以便测量各种软件应用程序之间的延迟。在我的c(++ |#)中,我使用
BOOL WINAPI QueryPerformanceCounter( __out LARGE_INTEGER * lpPerformanceCount );
WinApi电话。从java获取计数器的正确方法是什么。我没有成功搜索jna。我知道这是一个特定于平台的问题,但也许比编写自己的jni包装更快?
祝福, 阿明
答案 0 :(得分:3)
如何使用System.nanoTime
?我认为已经使用了机器的性能计数器,并且不需要编写本机包装器。
更新:根据this article on clocks and timers in the jvm“Windows上的时钟和计时器”部分
使用QueryPerformanceCounter / QueryPerformanceFrequency API实现System.nanoTime()
答案 1 :(得分:2)
这是本机包装器代码
1)文件W32Call.java
package jmSense.Native; public class W32Call {
public native static long QueryPerformanceCounter( );
public native static int QueryPerformanceCounterInt32( );
2)运行java h创建包含文件
3)从
创建一个dll“My Native Extensions.dll”#include "stdafx.h"
#include "windows.h"
#include "jmSense_Native_W32Call.h"
JNIEXPORT jlong JNICALL Java_jmSense_Native_W32Call_QueryPerformanceCounter(JNIEnv *, jclass)
{
LARGE_INTEGER g_CurentCount;
QueryPerformanceCounter((LARGE_INTEGER*)&g_CurentCount);
return g_CurentCount.QuadPart;
}
JNIEXPORT jint JNICALL Java_jmSense_Native_W32Call_QueryPerformanceCounterInt32(JNIEnv *, jclass)
{
LARGE_INTEGER g_CurentCount;
QueryPerformanceCounter((LARGE_INTEGER*)&g_CurentCount);
return g_CurentCount.LowPart;
}
4)像这样使用它:
System.loadLibrary("My Native Extensions");
System.out.println(W32Call.QueryPerformanceCounter());
细