使用JVMTI提供的MethodEntry
和MethodExit
事件挂钩,如何衡量在Java中执行的方法的时间?
简单来说就是:time2 - time1
但是我看到的问题是,如何区分不同的方法?有一个methodID,但递归调用呢?方法在打开后何时关闭?
我应该比较堆栈跟踪吗?什么是有意义的数据结构来跟踪输入的方法?像Map<StackTrace,Time>?
答案 0 :(得分:5)
每个线程都需要一个堆栈,并且每个MethodEnter
都会在堆栈上按下时间戳,在MethodExit
上弹出时间戳并计算当前时间的差值。
虽然您应该记住,阅读时间戳或刻度线以及周围的逻辑相对耗时。如果你在某种类型的分析器中使用这样的东西,你会得到一些结果,使得小的快速方法显得非常昂贵。即ByteBuffer.get()
的执行速度可能比测量代码快至少10倍。当JVMTI处于活动状态时,由于有限的JIT编译导致的失真,这些方法在收集的数据中很容易出现比正常情况下重100倍的方法。获得方法的执行时间份额有些可用数据的唯一方法是使用抽样。