我有这个问题,我不知道如何解决它 我必须测量执行某些功能所需的时间。好吧,以毫秒为单位测量时间的秒表功能还不够好,所以我在纳秒内使用了测量。
问题是,功能结束如此之快,即使秒表在纳秒内也无法测量。
我知道秒表有效,因为我试图将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);
答案 0 :(得分:7)
如何在循环中运行几千(或百万)次函数,测量总时间并将其除以迭代次数?
答案 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时代它并不是最快的解决方案答案 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
?