4

早上好,

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

BOOL WINAPI QueryPerformanceCounter( __out LARGE_INTEGER *lpPerformanceCount );

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

最良好的祝愿,阿明

4

2 回答 2

3

怎么用System.nanoTime?我认为已经使用了机器的性能计数器,不需要编写本机包装器。

更新:根据“Windows 上的时钟和定时器”部分中关于 jvm 中时钟和定时器的这篇文章

System.nanoTime() 使用 QueryPerformanceCounter/QueryPerformanceFrequency API 实现

于 2012-04-30T09:41:10.293 回答
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());

美好的

于 2012-06-04T09:28:07.173 回答