SLF4J - Perfilado

La distribución SLF4J proporciona slf4j-ext.jar esto contiene API para las funcionalidades tales como creación de perfiles, registro extendido, registro de eventos y registro con el agente java.

Perfilado

A veces, el programador desea medir algunos atributos como el uso de la memoria, la complejidad del tiempo o el uso de instrucciones particulares sobre los programas para medir la capacidad real de ese programa. Este tipo de medición sobre el programa se denomina elaboración de perfiles. La creación de perfiles utiliza un análisis de programa dinámico para realizar dicha medición.

SLF4J proporciona una clase llamada Profiler en el org.slf4j.profilerpaquete con fines de elaboración de perfiles. Esto se conoce como el perfilador del pobre. Con esto, el programador puede averiguar el tiempo necesario para realizar tareas prolongadas.

Creación de perfiles con la clase Profiler

El generador de perfiles contiene cronómetros y cronómetros secundarios y podemos iniciarlos y detenerlos utilizando los métodos proporcionados por la clase del generador de perfiles.

Para continuar con la creación de perfiles utilizando la clase Profiler, siga los pasos que se indican a continuación.

Paso 1: crear una instancia de la clase del generador de perfiles

Cree una instancia de la clase Profiler pasando un valor de cadena que represente el nombre del generador de perfiles. Cuando creamos una instancia de una clase Profiler, se iniciará un cronómetro global.

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

Paso 2: inicia un cronómetro para niños

Cuando invocamos el start() método iniciará un nuevo cronómetro infantil (con nombre) y, detendrá los cronómetros secundarios anteriores (o instrumentos de tiempo).

Invocar el start() método del Profiler class pasando un valor de cadena que representa el nombre del cronómetro secundario que se va a crear.

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

Después de crear estos cronómetros, puede realizar sus tareas o invocar esos métodos que ejecutan sus tareas.

Paso 3: inicie otro cronómetro para niños (si lo desea)

Si lo necesita, cree otro cronómetro usando el start()método y realizar las tareas necesarias. Si lo hace, iniciará un nuevo cronómetro y detendrá el anterior (es decir, la tarea 1).

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

Paso 4: detén los relojes

Cuando invocamos el stop() , detendrá el cronómetro infantil reciente y el cronómetro global y devolverá el instrumento de tiempo actual.

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

Paso 5: Imprima el contenido del instrumento de tiempo.

Imprima el contenido del instrumento de hora actual utilizando el print() método.

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

Ejemplo

El siguiente ejemplo demuestra la creación de perfiles utilizando la clase Profiler de SLF4J. Aquí hemos tomado dos tareas de muestra, imprimiendo la suma de los cuadrados de los números del 1 al 10000, imprimiendo la suma de los números del 1 al 10000. Estamos tratando de obtener el tiempo necesario para estas dos tareas.

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

Salida

Tras la ejecución, el programa anterior genera la siguiente salida:

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.

Registro de la información del generador de perfiles

En lugar de imprimir el resultado de un generador de perfiles para registrar esta información, debe:

  • Cree un registrador usando el LoggerFactory clase.

  • Cree un generador de perfiles creando una instancia de la clase Profiler.

  • Asocie el registrador al generador de perfiles pasando el objeto del registrador creado al setLogger() método del Profiler clase.

  • Finalmente, en lugar de imprimir el registro, la información del generador de perfiles log() método.

Ejemplo

En el siguiente ejemplo, a diferencia del anterior (en lugar de imprimir), estamos intentando registrar el contenido del instrumento de tiempo.

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

Salida

Tras la ejecución, el programa anterior genera la siguiente salida.

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