4

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

问题是,功能结束得太快了,即使是纳秒秒表也无法测量。

我知道秒表有效,因为我试图将例如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);
4

7 回答 7

7

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

但要注意编写微基准测试的许多陷阱

于 2011-02-25T12:40:55.343 回答
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;
于 2011-02-25T12:40:59.550 回答
1

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

于 2011-02-25T12:41:59.033 回答
1

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

如果您只需要测量非常短的时间,您有几种选择:

  • System.currentTimeMillis()- 在我的电脑上,它的分辨率为 60Hz,粒度约为 16ms
  • System.nanoTime()- 假设更准确,但我听说在多核 CPU 时代,这不是最快的解决方案
  • JNI - 在 C 中测量时间,但 JNI 调用的成本会很大。
于 2011-02-25T12:43:17.927 回答
0

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

于 2011-02-25T12:41:19.170 回答
0

根据 JVM 是否预热,您将得到非常不同的答案。对于您将多次调用的非常短的序列。你应该计算重复它们需要多长时间。

于 2011-02-25T12:41:33.960 回答
0

左侧字段中的答案:正如彼得劳里所说,大多数系统在比较两个调用时应该返回一个大于零的数字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吗?

于 2011-02-25T12:47:58.540 回答