Используя JProfiler, я обнаружил горячую точку в своем Java-коде, которую не могу понять. JProfiler объясняет, что этот метод занимает в среднем 150 с (674 с без прогрева), не считая времени, необходимого для вызова методов-потомков. 150 секунд может показаться немного, но в этом приложении они складываются (и это испытывают мои пользователи), а также кажутся большими по сравнению с другими методами, которые кажутся мне более сложными, чем этот. Поэтому для меня это важно.
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;
}
Я для себя минимизировал этот метод в разных направлениях, но он никогда не учит меня многому полезному. Я не могу не подчеркнуть, что продолжительность, сообщаемая JProfiler (150 с), касается только кода в этом методе и не включает время, необходимое для выполнения getAuthorization
, isDenied
, resetField
и т. д. Именно поэтому я начинаю с того, что просто публикую этот фрагмент без особого контекста, поскольку проблема, похоже, связана с этим кодом, а не с последующими вызовами методов-потомков.
Может быть, вы можете возразить, почему, если вы чувствуете, что я вижу призраков :) В любом случае, спасибо за ваше время!
getAppropriatePropertyFields
возвращаетList<Field>
. В примере профиля я обновляю веб-страницу, на которой информация о пользователе сначала считывается из базы данных, а затем извлекается список из 594 записей данных, обе из которых включают этот метод, то есть всего 595 вызовов. Пользовательские данные могут включать немного меньше полей, 14 относятся к этим 594 записям данных. - person Sander Verhagen   schedule 17.03.2013Reflection
(т.е.java.lang.reflect
)? Это может быть ужасно медленно!SecurityManager
может привести к задержкам. Если поля представляют собой примитивы, при доступе к их значениям возникает неявная упаковка/обтекание. - person gb96   schedule 04.04.2013