Java方法花了很多时间我无法解释

San*_*gen 6 java reflection performance jprofiler

使用JProfiler,我发现我的Java代码中有一个我无法理解的热点.JProfiler解释说这种方法平均需要150μs(674μs,没有预热),不包括调用后代方法所需的时间.150μs可能看起来不多,但在这个应用程序中,它加起来(并且我的用户经验丰富)并且看起来也很多,相比之下看起来比我更复杂的其他方法.因此对我来说很重要.

private boolean assertReadAuthorizationForFields(Object entity, Object[] state,
        String[] propertyNames) {
    boolean changed = false;
    final List<Field> fields = FieldUtil.getAppropriatePropertyFields(entity, propertyNames);
    // average of 14 fields to iterate over
    for (final Field field : fields) {
        // manager.getAuthorization returns an enum type
        // manager is a field referencing another component
        if (manager.getAuthorization(READ, field).isDenied()) {
            FieldUtil.resetField(field.getName(), state, propertyNames);
            changed = true;
        }
    }
    return changed;
}
Run Code Online (Sandbox Code Playgroud)

我为自己最小化了这个方法在不同的方向,但它从来没有教我很多有用的.我不能强调足够了JProfiler的报告的持续时间(150μs),仅为在此方法的代码,并且不包括需要执行的时间getAuthorization,isDenied,resetField并且这样的.这也是为什么我开始只是发布这个片段,没有太多的上下文,因为问题似乎是这个代码,而不是它后续的后代方法调用.

也许你可以争论为什么 - 如果你觉得我看到鬼魂:)无论如何,谢谢你的时间!

Pet*_*rey 0

我建议您自己为该方法计时,因为探查器并不总是给出准确的计时。

仅使用此代码创建一个微基准测试,并为其计时至少 2 秒。要计算方法调用产生的差异有多大,请将它们注释掉并对它们返回的值进行硬编码。