Java高精度秒表

时间:2011-02-25 12:37:21

标签: java stopwatch

我有这个问题,我不知道如何解决它 我必须测量执行某些功能所需的时间。好吧,以毫秒为单位测量时间的秒表功能还不够好,所以我在纳秒内使用了测量。

问题是,功能结束如此之快,即使秒表在纳秒内也无法测量。

我知道秒表有效,因为我试图将Thread.sleep(1)放在我的函数中(Thread.sleep以毫秒为单位),我得到的时间,但没有Thread.sleep,我的时间是永远是0.任何想法?

这是我的代码:

long startTimeLocalNS=0;
long stopTimeLocalNS = 0;
startTimeLocalNS = System.nanoTime();
if (something)
{
    /*my Code;*/
}   
stopTimeLocalNS = System.nanoTime();
disconnectTime = (stopTimeLocalNS - startTimeLocalNS);

7 个答案:

答案 0 :(得分:7)

如何在循环中运行几千(或百万)次函数,测量总时间并将其除以迭代次数?

但要注意许多pitfalls in writing microbenchmarks

答案 1 :(得分:1)

你可以这样做:

long startTimeLocalNS=0;
long stopTimeLocalNS = 0;
int count = 10000;
startTimeLocalNS = System.nanoTime();
if (something)
{
    while(count-- != 0) {
    /*my Code;*/
    }
}   
stopTimeLocalNS = System.nanoTime();
disconnectTime = (stopTimeLocalNS - startTimeLocalNS) / count;

答案 2 :(得分:1)

您可以循环测量待测代码1000次,然后将nanoTime-difference除以1000.

答案 3 :(得分:1)

您是否正在分析某些代码?如果是这样,市场上可用的配置文件将会做得更好。

如果您只需要测量很短的时间,您可以选择以下几种方法:

  • System.currentTimeMillis() - 在我的电脑上,它具有60Hz的分辨率,可提供约16ms的粒度
  • System.nanoTime() - 假设更准确,但我听说在多核CPU时代它并不是最快的解决方案
  • JNI - 用C来衡量时间,但JNI调用的成本会很高。

答案 4 :(得分:0)

如果您想对功能进行基准测试,最简单的方法是在一次测量中多次运行它。然后按呼叫量划分时间。

答案 5 :(得分:0)

根据JVM是否预热,您将得到一个非常不同的答案。对于非常短的序列,您将多次呼叫。你应该花些时间重复它们。

答案 6 :(得分:0)

左边区域的答案:正如Peter Lawrey所说,在比较两次nanoTime()的调用时,大多数系统应返回大于零的数字。但是,你绝对肯定你正在比较正确的价值观吗?你不小心会这样做:

long startTime = System.nanoTime();
if (something)
{
    /*my Code;*/
}
long stopTime = System.nanoTime();
disconnectTime = stopTime - stopTime; //note the error - you are subtracting stoptime from itself

所以,我的问题是,您的代码中是否存在您未在上面的示例代码中重现的错误?

第二个问题,您确定something==true