如何查询高分辨率性能计数器

时间:2012-04-30 09:13:54

标签: java winapi

早上好,

我需要获取CPU高分辨率性能计数器的值,以便测量各种软件应用程序之间的延迟。在我的c(++ |#)中,我使用

BOOL WINAPI QueryPerformanceCounter(   __out LARGE_INTEGER * lpPerformanceCount );

WinApi电话。从java获取计数器的正确方法是什么。我没有成功搜索jna。我知道这是一个特定于平台的问题,但也许比编写自己的jni包装更快?

祝福,  阿明

2 个答案:

答案 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());