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