我正在使用 ASM java 字节码检测,我的目标是测量每次访问变量的时间。
** 测量时间和日志 **
** 变量访问 **
我正在寻找微秒级的分辨率。它应该是准确的,因此足够“便宜”(这意味着我不想要一个需要 10 毫秒才能获得时间的函数或库)。
我已经尝试过System.NanoTime()
(太多,成本太高)和Calendar
(太松散),但我正在寻找更好的选择。
我正在使用 ASM java 字节码检测,我的目标是测量每次访问变量的时间。
** 测量时间和日志 **
** 变量访问 **
我正在寻找微秒级的分辨率。它应该是准确的,因此足够“便宜”(这意味着我不想要一个需要 10 毫秒才能获得时间的函数或库)。
我已经尝试过System.NanoTime()
(太多,成本太高)和Calendar
(太松散),但我正在寻找更好的选择。
System.nanotime()
是一个本地方法调用,如果这对您来说成本太高,那么您可能无法在 java 中找到适合您需求的东西。
我认为System.nanotime()
永远不会花费 10 毫秒(除非你专门做一些事情只是为了减慢它的速度)来执行。
最后,我不确定微秒对于属性访问时间是否足够精确,纳秒可能更有用。
...我不想要一个需要 10 毫秒才能获得时间的函数或库
首先,你夸大了。System.nanoTime()
不需要 10 毫秒。
其次,我认为纯 Java 中没有更快的方法。您可能能够从本机代码更快地访问系统时钟,但您的代码将是特定于平台的。(此外,我的直觉是它System.nanoTime()
会尽快完成。)
访问一个变量可能只需要几条机器指令,这取决于上下文和您正在访问的变量的类型。这可能会被访问系统计时器所花费的时间所淹没。
此外,在变量访问之前将方法调用插入时钟方法可能会使变量访问花费更长的时间。方法调用很容易使寄存器的内容无效,导致代码生成器插入指令以从内存中重新获取变量。
简而言之,插入获取时钟时间的代码可能会给您带来不可靠和误导性的计时数字。您可以通过对 LONG 指令序列进行计时来获得更有意义的数字……但如果您在基准测试方法中犯了错误,即使这样也会给您提供虚假数字。