Профилировка с вложенными уровнями - как организовать расчет данных
Для ручной профилировки кода пишу код, и если для одноуровневой вложенности реализовал, но если сессии измерения времени имеют многоуровневую вложенность, то как обработать данные рассчитать результаты не могу понять. Вложенности могут иметь такой вид:
enterSession(“1”);
…
for(;;) {
enterSession(“2”);
enterSession(“3”);
…
exitSession(“3”);
…
exitSession(“2”);
}
enterSession(“4”);
…
exitSession(“4”);
...
exitSession(“1”);
Соответственно надо рассчитать "чистое" время каждой сессии. Если сессия 1 длилась 700 мс, а вложенная сессия 2 450 мс, то "чистое" время 1 сессии 250 мс.
Одноуровневую статистику сделал на TreeMap, где ключ - имя сессии, а значением временные данные. Но никак не могу понять как отслеживать, что у сессии 1 есть вложенная сессия 2, у сессии 2 есть вложенная сессия 3. А после закрытия сессии 2 может быть вложенная сессия 4, у которой нет вложенных сессий. При этом сессии могут повторяться энное количество раз.
Как это можно реализовать? Прошу не код, а идеи. Спасибо.
Ответы (1 шт):
Мое решение исходит из посылки, что вы используете идентификатор сессии для доступа к ней. Вам нужно попробовать использовать ссылочную структуру данных. Идея такова - каждая сессия знает своего родителя, но родитель не знает о ней. Для быстрого поиска по объекту будем использовать, пожалуй, структуру данных HashMap.
Класс Session должен содержать следующие переменные: long time, Session parent. Также для реализации задуманного нам там нужен следующий метод:
public int getTime(){
return time - ((parent == null) ? 0 : parent.getTime());
}
Как происходит создание объекта сессии:
1) передаете родительскую сессию, если данная сессия вложенная
2) передаете то, по чему вы будете идентифицировать вашу сессию
3) передаете время сессии
Этот объект добавляете в HashMap<IDType, Session>. Когда он понадобится - берите его с помощью ключа - идентификатора сессии.