【问题标题】:Measure the CPU time elapsed for a part of code in JAVA测量JAVA中部分代码所用的CPU时间
【发布时间】:2013-04-04 16:11:16
【问题描述】:

我目前正在尝试测量我在 java 中的部分代码实际经过的 cpu 时间。 我读到要获得你必须使用的 CPU 时间

cpuTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

但实际上,当我尝试在那段代码中对其进行测量时,当经过的时间等于零时会引发错误.....(在我看来,这在纳秒精度下是不可能的)。 while 循环可以很大也可以很小(大约 10 次指令)。

long startTime = ManagementFactory.getThreadMXBean()
                        .getCurrentThreadCpuTime();
// reset with seed solution for each neighborRule and
// each pivoting rule
t.setCurrentBestSolution(seedSolution);
while (t.chooseNextImprovingNeighborSolution(pivotingRule,
                        neighborRule));                 
long endTime = ManagementFactory.getThreadMXBean()
                    .getCurrentThreadCpuTime();
if (endTime - startTime == 0) {
    System.err.println(pivotingRule + ":" + neighborRule);
    System.err.println("END TIME:" + endTime);
    System.err.println("START TIME:" + startTime);
                }

有什么想法吗?我没有正确使用 CPUThread 部分吗? 我应该使用外部 Java 基准测试器吗?

提前致谢

【问题讨论】:

  • 你无法比ns更精确地测量执行时间。如果你想对它进行基准测试,你必须构建一个循环或其他方式来让你的代码更长。

标签: java time cpu elapsed


【解决方案1】:

我应该使用外部 Java 基准测试器吗?

是的,请这样做。 Jprofiler 测量实际经过的时间以及其他有用的指标。​​

【讨论】:

  • JProfiler 主要用于基于网络的软件!我认为没有人不将它用于console 应用程序。 SystemRuntime 类可能会有所帮助。你怎么看?
  • 是什么让你产生了这个想法?我一直用它来分析普通的 Java 应用程序。您只需要在 VM 启动时正确连接代理即可。
  • 我会尝试看看 JProfiler 是否可以正常工作。拥有 0 并不是那么烦人,但是如果你不能精确地测量它,那么拥有纳秒精度的目标是什么。感谢您的回答
  • 问题在于 nanoTime() 不提供纳米级精度。只是纳米级精度。 nanoTime() 的更新分辨率会影响您的结果。原生 DLL / SO 应该能够通过使用具有更好更新分辨率的最高精度原生时钟来解决这个问题。完成后告诉我们结果如何。
【解决方案2】:

SystemRuntime 类的方法会帮助你。 看看:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html

例如:您可以使用:System.currentTimeMillis();,它以毫秒为单位返回您的程序之前和之后的时间! (在main方法的开头或结尾!)

【讨论】:

  • 谢谢,但我不知道运行时或系统如何为我提供 CPU 时间。
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 2020-02-06
  • 1970-01-01
  • 2013-12-11
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多