【问题标题】:How to improve System.currentTimeMillis() granularity?如何提高 System.currentTimeMillis() 粒度?
【发布时间】:2015-11-17 18:31:32
【问题描述】:

如何在不提供非常大的数组作为输入的情况下实现它?我正在测量不同算法的运行时间,对于包含 20 个元素的数组,我得到了非常(相同)相似的值。我尝试将总时间除以 1000000000 以清除 E,然后像 16 个镜像一样使用我复制输入数组并再次为镜像执行它。但是对于堆排序和快速排序仍然是一样的。有什么想法不需要写多余的行吗?

样本输出:

Random array:
MergeSort:
Total time 14.333066343496
QuickSort:
Total time 14.3330663435256
HeapSort:
Total time 14.3330663435256 

如果您需要代码 sn-ps,请通知我。

【问题讨论】:

  • 呃...为什么不用更大的数组进行测试呢?即使是微基准测试,您也需要超过一定的执行时间阈值。
  • 请填写邮政编码 sn-ps - 谢谢。
  • System.nanoTime() 的粒度是System.currentTimeMillis() 的 1000000 倍。
  • @Andreas 我很确定这是特定于操作系统的,但为了准确,来自 Oracle 的 Java API:This method provides nanosecond precision, but not necessarily nanosecond accuracy,但无论如何它可能是最准确的东西
  • @Andreas 这通常不是真的:docs.oracle.com/javase/8/docs/api/java/lang/…

标签: java performance sorting time


【解决方案1】:

对于您的直接问题,请使用System.nanoTime() 获取更精细的时间戳。

对于如何获得更好的基准的潜在问题,您应该在更大的数据集上反复运行基准。即使使用更精确的时钟,执行大约需要 14 毫秒的基准测试也会非常嘈杂。另见How do I write a correct micro-benchmark in Java?

【讨论】:

    【解决方案2】:

    您无法改进此方法的粒度。根据 Java SE 文档:

    以毫秒为单位返回当前时间。请注意,虽然单位 返回值的时间为毫秒,粒度为 value 取决于底层操作系统,可能更大。 例如,许多操作系统以几十为单位测量时间 毫秒。

    (source)

    正如其他人所说,对于时间流逝,public static long nanoTime() 会给你更高的精度,但不是分辨率:

    此方法提供纳秒级精度,但不一定 纳秒级分辨率。

    (source)

    【讨论】:

      猜你喜欢
      • 2022-09-30
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2014-03-21
      • 1970-01-01
      • 2015-12-20
      相关资源
      最近更新 更多