SLF4J - Perfilamento

Distribuição SLF4J fornece slf4j-ext.jar contém APIs para as funcionalidades, como criação de perfil, registro estendido, registro de evento e registro com agente java.

Profiling

Às vezes, o programador deseja medir alguns atributos como o uso de memória, complexidade de tempo ou uso de instruções específicas sobre os programas para medir a capacidade real desse programa. Esse tipo de medição sobre o programa é chamado de criação de perfil. A criação de perfil usa análise de programa dinâmica para fazer tal medição.

SLF4J fornece uma classe chamada Profiler no org.slf4j.profilerpacote para fins de criação de perfil. Isso é conhecido como o criador de perfil do homem pobre. Usando isso, o programador pode descobrir o tempo que leva para realizar tarefas prolongadas.

Criação de perfil usando a classe Profiler

O criador de perfil contém cronômetros e cronômetros filhos e podemos iniciá-los e interrompê-los usando os métodos fornecidos pela classe do criador de perfil.

Para continuar com a criação de perfil usando a classe profiler, siga as etapas fornecidas a seguir.

Etapa 1 - instanciar a classe do profiler

Instancie a classe Profiler passando um valor String que representa o nome do profiler. Quando instanciamos uma classe Profiler, um cronômetro global será iniciado.

//Creating a profiler
Profiler profiler = new Profiler("Sample");

Etapa 2 - Iniciar um cronômetro infantil

Quando invocamos o start() ele iniciará um novo cronômetro filho (denominado) e interromperá os cronômetros filhos anteriores (ou instrumentos de tempo).

Invoque o start() método do Profiler passando um valor String que representa o nome do cronômetro filho a ser criado.

//Starting a child stopwatch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();

Depois de criar esses cronômetros, você pode executar suas tarefas ou invocar os métodos que executam suas tarefas.

Etapa 3: inicie outro cronômetro infantil (se desejar)

Se necessário, crie outro cronômetro usando o start()método e executar as tarefas necessárias. Se você fizer isso, ele iniciará um novo cronômetro e parará o anterior (ou seja, tarefa 1).

//Starting another child stopwatch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();

Etapa 4: pare os relógios

Quando invocamos o stop() , ele irá parar o cronômetro filho recente e o cronômetro global e retornará o instrumento de tempo atual.

// Stopping the current child stopwatch and the global stopwatch.
TimeInstrument tm = profiler.stop();

Etapa 5: Imprima o conteúdo do instrumento de hora.

Imprima o conteúdo do instrumento de hora atual usando o print() método.

//printing the contents of the time instrument
tm.print();

Exemplo

O exemplo a seguir demonstra a criação de perfil usando a classe Profiler de SLF4J. Aqui pegamos duas tarefas de amostra, imprimindo a soma dos quadrados dos números de 1 a 10000, imprimindo a soma dos números de 1 a 10000. Estamos tentando obter o tempo gasto para essas duas tarefas.

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();
   }
}

Resultado

Após a execução, o programa acima gera a seguinte saída -

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.

Registrando as informações do Profiler

Em vez de imprimir o resultado de um criador de perfil para registrar essas informações, você precisa -

  • Crie um logger usando o LoggerFactory classe.

  • Crie um profiler instanciando a classe Profiler.

  • Associe o logger ao profiler passando o objeto logger criado para o setLogger() método do Profiler classe.

  • Finalmente, em vez de imprimir o log, as informações do criador de perfil usando o log() método.

Exemplo

No exemplo a seguir, ao contrário do anterior (em vez de imprimir), estamos tentando registrar o conteúdo do instrumento de tempo.

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();
   }
}

Resultado

Após a execução, o programa acima gera a seguinte saída.

Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000