Java高精度秒表

Java高精度秒表,java,stopwatch,Java,Stopwatch,我有这个问题,我不知道如何解决它。 我必须测量执行某些功能所需的时间。好的,秒表的计时功能以毫秒为单位还不够好,所以我用纳秒为单位 问题是,函数结束得如此之快,即使秒表在纳秒内也无法测量它 我知道秒表是有效的,因为我试图在我的函数中加入例如Thread.sleep(1)(Thread.sleep以毫秒为单位),我得到了我的时间,但没有Thread.sleep,我的时间总是0。有什么想法吗 这是我的密码: long startTimeLocalNS=0; long stopTimeLocalNS

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

问题是,函数结束得如此之快,即使秒表在纳秒内也无法测量它

我知道秒表是有效的,因为我试图在我的函数中加入例如
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);

在一个循环中运行该函数几千次(或几百万次),测量总时间并将其除以迭代次数,怎么样


但是要小心很多。你可以这样做:

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;

若你们想对你们的函数进行基准测试,最简单的方法就是在一次测量中运行它几次。然后将时间除以调用量。

根据JVM是否预热,您将得到一个非常不同的答案。对于非常短的序列,您将调用多次。您应该计算重复这些操作所需的时间。

您可以在待测代码中循环1000次,然后将纳米时间差除以1000。

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

如果您只需要测量很短的时间段,您有几个选项:

  • System.currentTimeMillis()
    -在我的电脑上,它的分辨率为60Hz,粒度约为16ms
  • System.nanoTime()
    -应该更准确些,但我听说在多核CPU时代,它不是最快的解决方案
  • JNI—用C度量时间,但JNI调用的成本将是巨大的

左字段外的答案:正如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
所以,我的问题是,您的代码中是否有一个bug没有在上面的示例代码中重现


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

如果时间为0,您的系统上没有非常精确的nanoTime()时钟。如果我在我的系统上执行
long time=System.nanTime()-System.nanoTime()
,它通常是100或更多。(因为这是通话所需的时间)你确定某件事是真的吗?如果需要这么短的时间,你为什么会在乎需要多长时间?微基准点倾向于使用循环(预热后)。更有用的基准测试会做一些有用的事情。有没有可能有什么东西正在优化第二次调用,而只是使用第一个值?@Peter Yes,something==true,这是100%。我将在系统上搜索我的纳米钟的精度。这应该会有帮助@汤姆:嗯,我需要时间。如果我不这样做,我就不会寻求帮助…=]嗯,我的函数有点特殊,不能运行超过1次。但是,如果我总是得到我的纳米钟无法测量的时间,并且我将它除以迭代次数,那么我将再次得到0次?@CRT\u flow:不确定你的意思。你的要求听起来很荒谬。我甚至可以说,您不可能多次运行该函数。我认为@CRT\u flow认为您为该方法的每次调用计时。@CRT\u flow:Michael建议您计算X百万次调用的总时间,并将其除以调用次数。他并不是建议你调用它X百万次,每次调用都要计时。是的,我确信我的if语句是正确的,我没有做stopTime-stopTime=]酷-我想我只是问:)有没有办法让秒表暂停一段时间,然后继续计时。还没有找到任何合适的答案。你能提到一些可用的探查器吗?最好是开源的?当然,jvisualvm是免费的,并且有一个内置的分析器(但我从未尝试过)。我知道JProfiler非常好,很多人也建议你使用它。正如我所说,我的功能是特定的,只能测量一次。。。另外,完成我的程序需要更长的时间,所以这是一个有点混乱的解决方案。