Java中的精确时间测量

pen*_*pen 17 java performance measurement

Java提供了两种获取当前时间的方法:System.nanoTime()System.currentTimeMillis().第一个给出一个纳秒的结果,但实际精度比那个(很多微秒)差很多.

JVM是否已为每台特定机器提供最佳价值?否则,是否有一些Java库可以通过绑定到特定系统来提供更精细的测量?

jjn*_*guy 16

获得超精确时间测量的问题在于某些处理器不能/不能提供如此微小的增量.

据我所知,System.currentTimeMillis()而且System.nanoTime()是你将能够找到最好的测量.

请注意,两者都返回一个long值.

  • 他们可以跟踪时间,但这并不意味着他们准确地报告时间. (2认同)
  • 不要忘记有开销:涉及系统调用,通常只有微秒级(只是跳入内核并退出,但这是时钟读取的昂贵部分).然后,您可能已启用已启用抢先的已加载系统,这意味着可能会安排其他某些进程.即使不是这种情况,这意味着您仍然必须跳入JVM,即使使用JITed代码,也会有轻微的开销.在本机gode中,您可以使用clock_gettime和friends API来探索高分辨率计时器的准确性. (2认同)

AlB*_*lue 5

在Java测量时间到纳秒级别时,这有点毫无意义; 偶尔的GC命中将很容易消除这可能给出的任何准确性.在任何情况下,文档都指出虽然它提供纳秒精度,但它与纳秒精度不同; 并且有些操作系统在任何情况下都不报告纳秒(这就是为什么你在访问时会发现量化为1000的答案;这不是运气,而是限制).

不仅如此,而且取决于操作系统实际实现的功能,您可能会发现无论如何都会出现量化结果(例如总是以64或128而不是中间值结束的答案).

值得注意的是,该方法的目的是找到一些(附近)开始时间和现在之间的两个时间差; 如果你在长时间运行的应用程序的开头采用System.nanoTime(),然后很长一段时间后采用System.nanoTime(),它可能已经远离实时.所以你应该只在不到1秒的时间内使用它; 如果你需要比这更长的运行时间,毫秒就足够了.(如果不是,那么补上最后几个数字;你可能会给客户留下深刻印象,结果也同样有效.)