All streams
Search
Write a publication
Pull to refresh

Comments 6

Зачем итерироваться по Set-у через toArray(), когда Set сам по себе Iterable? Он может меняться во время исполнения?


Как я понял, стартовый таймстамп сохраняется в статической переменной? Даже если забыть про вопрос многопоточности, если внутри одного класса один инструментированный метод вызывает другой, результат замера внешнего метода будет неправильным.

toArray() создает новый массив в памяти и в принципе норм. Итератор +2 строчки кода.
По второму вашему комментарию:
Вопрос со статичным полем можно решить и сделать локальные переменные, тогда все будет правильно рассчитываться. Как правило, для моих целей, меня интересует только один метод в классе. Корявость расчета отпадает. НО если сделать локальные переменные javaassist addCatch перестает видеть startTime в блоке finally, потому-что объявляется внутри трая.
Не смог разобраться с javaasist как это сделать. Если знаете как, подскажите, буду признателен.
Отсутствие трай кетча тоже можно пережить и пренебречь проблемой отсутствия некоторых замеров в момент возникновения исключений — как статистическая погрешность. Вот пример реально декомпилированного класса.
import ru.ltm.agent.jmx.ClassesMetricsProfiler;

public class RFDataBasesP1S1 extends EXEBaseStep {
  
  public static final ClassesMetricsProfiler metricsProfiler = new ClassesMetricsProfiler();
  
  public static long __metricStartTime = System.currentTimeMillis();
  
  
  public Object processStep(Object pObject) {
    try {
      __metricStartTime = System.currentTimeMillis();
      
    } catch (Exception exception) {
      throw exception;
    } finally {
      Object object = null;
      metricsProfiler.mark2("com.ssaglobal.scm.wms.service.drfmanagement.RFDataBasesP1S1.processStep", System.currentTimeMillis() - __metricStartTime);
    } 
    return context;
  }
}
Цикл for сам по себе поддерживает Iterable (если у вас, конечно, не какая-нибудь древняя версия java)
for (Settings settingObj : methodsToInstrument) {
...
}


Замерять начало выполнения можно и перед try, там же создавать переменную. В байт-коде try никак не проявляется, см. статью, раздел «Обработка исключений». В этом случае, по идее, переменная должна быть видна во всей функции. Но я с javaassist не работал, там могут быть свои нюансы.

Можно и так. Попробую поковырять.

Логичный вопрос зачем собирать метрики инструментарием и jmx, когда есть jprofiler?
Sign up to leave a comment.

Articles