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 , передав значение 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 () .
Создайте регистратор, используя класс 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(); } }
Выход
После выполнения вышеуказанная программа генерирует следующий вывод.