Учебники

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 , передав значение 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();
   }
}

Выход

После выполнения вышеуказанная программа генерирует следующий вывод.