SLF4J - Профилирование
SLF4J Distribution предоставляет slf4j-ext.jar он содержит API-интерфейсы для таких функций, как профилирование, расширенное ведение журнала, ведение журнала событий и ведение журнала с помощью Java-агента.
Профилирование
Иногда программист хочет измерить некоторые атрибуты, такие как использование памяти, временная сложность или использование определенных инструкций о программах, чтобы измерить реальные возможности этой программы. Такой вид измерения программы называется профилированием. Профилирование использует динамический программный анализ для выполнения таких измерений.
SLF4J предоставляет класс с именем Profiler в org.slf4j.profilerпакет для профилирования. Это известно как профайлер бедняка. Используя это, программист может узнать время, затраченное на выполнение длительных задач.
Профилирование с использованием класса Profiler
Профилировщик содержит секундомеры и дочерние секундомеры, и мы можем запускать и останавливать их, используя методы, предоставляемые классом профилировщика.
Чтобы продолжить профилирование с использованием класса профилировщика, выполните действия, указанные ниже.
Шаг 1. Создайте экземпляр класса профилировщика
Создайте экземпляр класса Profiler, передав значение String, представляющее имя профилировщика. Когда мы создаем экземпляр класса Profiler, запускается глобальный секундомер.
//Creating a profiler
Profiler profiler = new Profiler("Sample");
Шаг 2 - Запустите детский секундомер
Когда мы вызываем start() Метод запускает новый дочерний секундомер (названный) и останавливает более ранние дочерние секундомеры (или приборы времени).
Вызвать start() метод Profiler class, передав значение String, представляющее имя создаваемого дочернего секундомера.
//Starting a child stopwatch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
После создания этих секундомеров вы можете выполнять свои задачи или вызывать те методы, которые запускают ваши задачи.
Шаг 3. Включите еще один детский секундомер (если хотите)
При необходимости создайте еще один секундомер, используя start()метод и выполнить необходимые задачи. Если вы это сделаете, он запустит новый секундомер и остановит предыдущий (т.е. задача 1).
//Starting another child stopwatch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
Шаг 4. Остановите часы
Когда мы вызываем stop() , он остановит последний дочерний секундомер и глобальный секундомер и вернет текущий инструмент времени.
// Stopping the current child stopwatch and the global stopwatch.
TimeInstrument tm = profiler.stop();
Шаг 5: Распечатайте содержимое инструмента времени.
Распечатайте содержимое инструмента текущего времени, используя print() метод.
//printing the contents of the time instrument
tm.print();
пример
В следующем примере демонстрируется профилирование с использованием класса Profiler для SLF4J. Здесь мы взяли две примерные задачи: распечатали сумму квадратов чисел от 1 до 10000, напечатали сумму чисел от 1 до 10000. Мы пытаемся получить время, затраченное на эти две задачи.
import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;
public class ProfilerExample {
public void demoMethod1(){
double sum = 0;
for(int i=0; i< 1000; i++){
sum = sum+(Math.pow(i, 2));
}
System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
}
public void demoMethod2(){
int sum = 0;
for(int i=0; i< 10000; i++){
sum = sum+i;
}
System.out.println("Sum of the numbers from 1 to 10000: "+sum);
}
public static void main(String[] args) {
ProfilerExample obj = new ProfilerExample();
//Creating a profiler
Profiler profiler = new Profiler("Sample");
//Starting a child stop watch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
//Starting another child stop watch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
//Stopping the current child watch and the global watch.
TimeInstrument tm = profiler.stop();
//printing the contents of the time instrument
tm.print();
}
}
Вывод
После выполнения вышеуказанная программа генерирует следующий вывод:
Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000
+ Profiler [BASIC]
|-- elapsed time [Task 1] 2291.827 microseconds.
|-- elapsed time [Task 2] 225.802 microseconds.
|-- Total [BASIC] 3221.598 microseconds.
Регистрация информации профилировщика
Вместо того, чтобы печатать результат профилировщика для регистрации этой информации, вам необходимо:
Создайте регистратор, используя LoggerFactory класс.
Создайте профилировщик, создав экземпляр класса Profiler.
Свяжите регистратор с профилировщиком, передав созданный объект регистратора в setLogger() метод Profiler класс.
Наконец, вместо печати журнала информация профилировщика с помощью log() метод.
пример
В следующем примере, в отличие от предыдущего (вместо печати), мы пытаемся записать содержимое инструмента времени.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;
public class ProfilerExample_logger {
public void demoMethod1(){
double sum = 0;
for(int i=0; i< 1000; i++){
sum = sum+(Math.pow(i, 2));
}
System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
}
public void demoMethod2(){
int sum = 0;
for(int i=0; i< 10000; i++){
sum = sum+i;
}
System.out.println("Sum of the numbers from 1 to 10000: "+sum);
}
public static void main(String[] args) {
ProfilerExample_logger obj = new ProfilerExample_logger();
//Creating a logger
Logger logger = LoggerFactory.getLogger(ProfilerExample_logger.class);
//Creating a profiler
Profiler profiler = new Profiler("Sample");
//Adding logger to the profiler
profiler.setLogger(logger);
//Starting a child stop watch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
//Starting another child stop watch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
//Stopping the current child watch and the global watch.
TimeInstrument tm = profiler.stop();
//Logging the contents of the time instrument
tm.log();
}
}
Вывод
После выполнения вышеуказанная программа генерирует следующий вывод.
Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000