понедельник, 1 июня 2015 г.
Засекаем время в java
Предистория
Как-то раз я занимался оптимизацией сложной операции,
выполняемой на сервере, которая включала в себя несколько запросов
к базе данных с последующей группировкой и сортировкой по определенным
параметрам полученных данных. К сожалению, средствами SQL запросов
обойтись не получилось, так как в конечной выборке участвовали
данные полученные по веб-сервисам из внешних систем. Поэтому приходилось
выполнять группировку и сортировку данных с помощью кода приложения.
Когда я запустил первый раз этот код на реальных
данных, очевидно, все работало неприемлемо медленно и требовало
оптимизации. С чего начинать оптимизацию? Правило Парето никто
не отменял и оно гласит, что нужно начинать оптимизацию тех участков
кода, выполнение которых занимает львиную долю времени выполнения
операции. Возникла задача выяснить, какой из этапов крупной операции
выполняется дольше остальных, и насколько дольше. Для этого необходимо
"стоять с секундомером" и засекать начало и конец каждого этапа и
результат выводить в лог. На момент решения данной задачи я обошелся
собственным решением, в котором я запоминал System.currentTimeMillis()
в промежуточные значения в локальных переменных. Затем происходил
подсчет разниц времени вывод в лог описаний. У данного подхода я
обнаружил существенные недостатки:
- Код сильно загрязнился. Локальные переменные заполонили код, и его стало читать очень сложно.
- Сложно исправлять/добавлять новую операцию, так как логика о подсчету времени размазана.
Но есть и плюс, только он на мой взгляд один: это гибкость и возможность написать то, что тебе нужно.
Мне такое решение не давало покоя и я решил сделать небольшой обзор инструментов подсчета времени в java.
Подписаться на:
Сообщения (Atom)