我只是尝试使用jvisualvm剖析一个相对简单的Java程序。结果有些奇怪:小的4行方法具有最多的自拍时间,比其他任何方法都多!
public class Hub
public void clock() {
for (int i = 0; i < cogs.length; i++) {
cogs[i].clock(cnt, i, this);
}
cnt++;
}
}
注意:在这种情况下,cogs.length为8!
这很奇怪,因为Cog.clock方法要大得多!我能提出的唯一合理的解释是,大多数(在这种情况下,是8个中的6个)Cog对象将处于“停止”状态,如下所示:
public class Cog
public void clock(int cnt, int cogid, Hub hub) {
if (state == State.STOP)
return;
//long code goes here
}
}
但这不应该有太大的影响!这是证明图片:
分析会影响代码的运行时间,因为它会对代码进行检测(修改)。您在9_000毫秒内运行了12_000_000次调用,即每次调用大约750纳秒,这是在仪器化使其速度变慢之后的情况,因此,如果没有仪器化,则可能会更少。在每次调用的这种情况下,我不会期望探查器提供任何合理的信息,也不会比较不同方法的结果,这很可能是调用次数更多的方法会比调用次数更少的方法获得更高的得分(如果大多数
调用仅检查状态并退出)。您可以尝试使用VisualVM采样器,但是我不确定它是否足够准确。您可以尝试自己测量时间(使用
Cog.clock
),但是即使如此,也不能保证达到亚微秒的精度。
我是一名优秀的程序员,十分优秀!