什么是以微秒为单位测量Java时间的最有效,“便宜”和准确的方法?

时间:2011-02-25 09:25:38

标签: java time-measurement

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

  

**测量时间和记录**

     

**变量访问**

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

我已经尝试System.NanoTime()(太多,费用太高)和Calendar(太宽松),但我正在寻找更好的选择。

2 个答案:

答案 0 :(得分:6)

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

我认为System.nanotime()永远不会花费10毫秒(除非你专门做些什么只是为了减慢速度)才能执行。

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

答案 1 :(得分:2)

  

...我不想要一个需要10毫秒来获取时间的函数或库

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

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


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

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

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