Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用currentTimeMillis()方法获得小部分的执行时间_Java_Performance_Optimization_Execution Time_Elapsedtime - Fatal编程技术网

Java 如何使用currentTimeMillis()方法获得小部分的执行时间

Java 如何使用currentTimeMillis()方法获得小部分的执行时间,java,performance,optimization,execution-time,elapsedtime,Java,Performance,Optimization,Execution Time,Elapsedtime,我需要得到Java中函数的执行时间。我知道我可以使用两种方法: currentTimeMillis()和nanoTime()

我需要得到Java中函数的执行时间。我知道我可以使用两种方法:
currentTimeMillis()
nanoTime()currentTimeMillis()会更准确(即,好像我是从挂钟测量执行所花费的时间,而不是处理时间)

但是
currentTimeMillis()不能给我小分数。例如,如果执行时间小于1毫秒,则返回0。我需要时间,即使它小于1,比如说,0.05毫秒。这是一个简单的例子,当方法返回0时

long startTime=System.currentTimeMillis();
for(int x=0; x<10;x++)
{
    System.out.println("-");
}

long execTime=System.currentTimeMillis() - startTime;
long startTime=System.currentTimeMillis();
对于(int x=0;x
我知道我可以使用两种方法:
currentTimeMillis()
nanoTime()
。但我知道如果我需要挂钟时间,
currentTimeMillis()
更准确(即,好像我是从挂钟测量执行所花费的时间,而不是处理时间)

这只是部分准确

这两个函数都返回墙上的时钟时间,而不是CPU时间

与精度不同的是,
currentTimeMillis()
是相对于一个众所周知的时间点,而
nanoTime()
是相对于某个任意的时间点。这意味着您无法轻松地将
nanoTime()
的结果转换为您和我都能理解的时间戳

您仍然可以使用它来测量墙上的时钟间隔:只需调用两次
nanoTime()
,然后计算差值。这正是它的设计初衷


最后,如果您要用它来分析一些代码,请阅读这里有很多微妙之处。

使用
System.nanoTime()
它的精度为纳秒。

尽管您可以也应该使用nanoTime来获得代码块最精确的可用执行时间。但是,您应该谨慎使用它,因为有许多外部问题可能会影响执行时间

例如,任何时候在没有最近运行的情况下调用一个方法,都会有将其放入缓存的开销。根据同一页中的其他内容,甚至可能会有磁盘读取将其放入内存

如果一个方法只运行一次,与多次运行相比,JVM可能会以不同的方式对待它


通常,当您关心微秒时,这是因为您要测量的东西将在作业或事务中运行多次。要获得准确的测量结果,您需要跨多个调用进行测量。这样做还可以减少调用nanoTime的开销时间的影响。

您考虑过使用探查器吗?“但是我把它改成了双精度的,因为我想要浮点数,这有什么害处吗?”?"如果返回的毫秒或纳秒数大于
2^53
,则会产生舍入效应,但大多数情况下,这是毫无意义的,因为计时器返回整数值。你能检查一下吗:。它们说:
,与系统或挂钟时间的任何其他概念都无关。
。我误解了什么吗?@WiliamA你正在阅读的文档参考称“只能用于测量经过的时间”。您正在尝试测量经过的时间,因此没有问题。问题是纳米时间结果与日期无关。如果您在周三开始一个长时间运行的作业,周四开始另一个作业,那么周三作业中的纳米时间调用可能比周四作业中晚些时候发生的纳米时间调用的结果更大。@WiliamA:我认为融合是术语。
nanoTime()
的已用秒数与您和我的秒数相同。未定义的是
nanoTime()
开始计数的原点。您仍然可以减去两个
nanoTime()
值,得到有意义的结果。