【问题标题】:What is the most efficient, "cheap" and accurate way to measure time in Java in resolution of microseconds?在 Java 中以微秒为单位测量时间的最有效、“便宜”和准确的方法是什么?
【发布时间】:2011-02-25 09:25:37
【问题描述】:

我正在使用 ASM java 字节码检测,我的目标是测量每次访问变量的时间。

** 测量时间并记录 **

** 变量访问 **

我正在寻找微秒级的分辨率。它应该是准确的,因此足够“便宜”(这意味着我不想要一个需要 10 毫秒才能获得时间的函数或库)。

我已经尝试过System.NanoTime()(太多,而且成本高昂)和Calendar(太松散),但我正在寻找更好的选择。

【问题讨论】:

  • System.nanoTime() 通常需要大约 0.2 微秒,但我看到它最多需要 1.0 微秒。注意:您可能需要调用它两次。
  • 访问一个变量通常需要 1 到 30 纳秒,具体取决于它是否在缓存中。用 nanoTime 来衡量它是非常困难的,因为它是如此之短。您确定需要测量亚微秒级事件吗?
  • @Peter Lawrey - 为什么我可能会调用它两次?好吧,我用 System.NanoTime() 做了很多模拟,不幸的是每次访问之间有超过 10^3 的时间差异......这让我相信微秒就足够了
  • 为什么不只计算访问次数并假设所用时间大致相同。 (实际上,对于最频繁访问的数据来说,平均而言它会更短(总共更长),因为这是缓存的设计目的)
  • 计算访问次数不应依赖于机器。 AFAIK 大多数分析器都在某处使用这种方法。

标签: java time-measurement


【解决方案1】:

System.nanotime() 是一个本地方法调用,如果这对您来说成本太高,那么您可能无法在 java 中找到适合您需求的东西。

我认为System.nanotime() 的执行也不会花费 10 毫秒(除非您专门做一些事情来减慢它的速度)。

最后,我不确定微秒对于属性访问时间是否足够精确,纳秒可能更有用。

【讨论】:

  • “我不确定 ms 是否准确”我认为您的意思是“uS”/微秒。
  • 是的,我的错。我的意思是微秒。现在更新它。谢谢提醒。
【解决方案2】:

...我不想要一个需要 10 毫秒才能获得时间的函数或库

首先,你夸大了。 System.nanoTime() 不需要 10 毫秒。

其次,我认为纯 Java 中没有更快的方法。您可能可能能够从本机代码更快地访问系统时钟,但您的代码将是特定于平台的。 (此外,我的直觉是System.nanoTime() 会尽快完成。)


访问变量可能只需要几条机器指令,具体取决于上下文和您要访问的变量类型。这可能会被访问​​系统计时器所花费的时间所淹没。

此外,在变量访问之前将方法调用插入时钟方法可能会使变量访问花费更长的时间。方法调用容易使寄存器的内容无效,导致代码生成器插入指令从内存中重新获取变量。

简而言之,插入获取时钟时间的代码可能会给您提供不可靠和误导性的计时数字。通过对 LONG 指令序列进行计时,您可能会获得更有意义的数字……但如果您在基准测试方法中犯了错误,即使这样也会给您提供虚假数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2016-02-02
    • 2010-12-15
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多