奇怪的探查器结果

时间:2016-10-02 09:10:49

标签: java performance

我只是尝试使用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
    }
}

但这不应该产生太大的影响!这是一张证明图片:

enter image description here

1 个答案:

答案 0 :(得分:0)

分析会影响代码的运行时间,因为它会对其进行检测(修改)。你有9_000毫秒运行的12_000_000次调用,每次调用大约750纳秒,这是在仪器使它变慢之后,因此没有可能更少的仪器。在每次调用的这种时候,我不会期望任何合理的分析器,并且不会将其结果与不同的方法进行比较,很可能是具有更多调用的方法将获得比具有更少调用的方法更高的分数(如果大多数)您的Cog.clock调用仅检查状态并退出)。您可能尝试使用VisualVM采样器,但我不确定它是否足够准确。您可能会尝试自己测量时间(使用System.nanoTime()),但即使这样也不能保证精确到亚微秒。