gpt4 book ai didi

java - 可靠的跨平台方式获取Java中的方法时间

转载 作者:搜寻专家 更新时间:2023-11-01 02:36:47 25 4
gpt4 key购买 nike

这个问题不是关于基准的。

我有一个 java 线程周期,应该在接近周期时间 T 时运行:

public class MyRunnable implements Runnable {

private final long period = 10000L; //period T, in this case 10 secs

public void run() {
while() {
long startTime = this.getTime();

this.doStuff();

long endTime = this.getTime();
long executionTime = endTime - startTime;
if(executionTime < this.period) {
long sleepTime = (this.period - executionTime);
try {
Thread.sleep(sleepTime);
} catch(InterruptedException iex) {/*handle iex*/}
}
}
}

private long getTime() {
return System.currentTimeMillis();
}

private void doStuff() {/*do stuff*/}

}

当然,根据调度优先选择,Thread.sleep(sleepTime) 可能略大于 sleepTime。但是,平均而言,这种方法提供了对周期 T 的接近平均近似值。

问题

方法:

private long getTime() {
return System.currentTimeMillis();
}

提供挂钟引用时间。如果机器的时钟发生变化,向前或向后,此实现无法提供周期 T 的近似值。例如:

long t1 = getTime();
Thread.sleep(30000);
long t2 = getTime();
System.out.println(t2 - t1);

如果有人在 Thread.sleep(30000)“运行”时提前三分钟手动更改时钟,则打印类似 204283 的内容。

由于系统时钟总是在变化(时间服务器同步、系统负载、用户设置等...),使用 System.currentTimeMillis() 无法满足我的需求。

失败的解决方案

为了提供更可靠的时间引用,我尝试了以下 getTime 方法的实现:

long getTime() {
long result;
ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
if (mxBean.isThreadCpuTimeSupported()) {
result = mxBean.getCurrentThreadCpuTime()/1000000L;
} else {
throw new RuntimeException("unsupported thread cpu time");
}
return result;
}

getCurrentThreadCpuTime 的问题在于生成的时间量是线程消耗 的 CPU 时间,而不是那一瞬间剩余的时间。不考虑线程 hibernate 或阻塞时剩余的时间。例如:

long t1 = getTime();
Thread.sleep(30000);
long t2 = getTime();
System.out.println(t2 - t1);

getCurrentThreadCpuTime getTime 的实现令人惊讶地打印“0”(零)。

我想要什么

我想我需要的是这样的:

private long getTime() {
long cpuCycles = getAmountOfCPUCyclesSinceTheProgramStarted();
long cpuFrequency = getCPUFrequency();
long result = cpuCycles / cpuFrequency;
return result;
}

问题是我没有找到以跨平台方式实现 getAmountOfCPUCyclesSinceTheProgramStarted()getCPUFrequency() 的 java 方法。

最后,我的问题是:java中如何跨平台可靠的获取某个方法的耗时?

最佳答案

尝试使用 System.nanoTime(),它似乎就是您要找的。

来自 the docs:

This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time.

关于java - 可靠的跨平台方式获取Java中的方法时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48013409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com