SLF4J - Profilazione

La distribuzione SLF4J fornisce slf4j-ext.jar questo contiene API per le funzionalità come la profilazione, la registrazione estesa, la registrazione degli eventi e la registrazione con java agent.

Profilazione

A volte il programmatore vuole misurare alcuni attributi come l'uso della memoria, la complessità temporale o l'utilizzo di istruzioni particolari sui programmi per misurare la reale capacità di quel programma. Questo tipo di misurazione sul programma è chiamato profilazione. La creazione di profili utilizza l'analisi dinamica del programma per eseguire tale misurazione.

SLF4J fornisce una classe denominata Profiler nel org.slf4j.profilerpacchetto a scopo di profilazione. Questo è noto come il profiler del povero. In questo modo, il programmatore può scoprire il tempo impiegato per eseguire attività prolungate.

Profiling utilizzando la classe Profiler

Il profiler contiene cronometri e cronometri figlio e possiamo avviarli e interromperli utilizzando i metodi forniti dalla classe profiler.

Per continuare con la profilazione utilizzando la classe profiler, seguire i passaggi indicati di seguito.

Passaggio 1: creare un'istanza della classe del profiler

Creare un'istanza della classe Profiler passando un valore String che rappresenta il nome del profiler. Quando creiamo un'istanza di una classe Profiler, verrà avviato un cronometro globale.

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

Passaggio 2: avvia un cronometro per bambini

Quando invochiamo il start() metodo avvierà un nuovo cronometro figlio (denominato) e arresta i cronometri figlio precedenti (o strumenti tempo).

Invoca il file start() metodo del Profiler class passando un valore String che rappresenta il nome del cronometro figlio da creare.

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

Dopo aver creato questi cronometri, puoi eseguire le tue attività o, invocare quei metodi, che eseguono le tue attività.

Passaggio 3: avvia un altro cronometro per bambini (se lo desideri)

Se necessario, crea un altro cronometro utilizzando il file start()metodo ed eseguire le attività richieste. Se lo fai, avvierà un nuovo cronometro e interromperà quello precedente (cioè l'attività 1).

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

Passaggio 4: fermare gli orologi

Quando invochiamo il stop() metodo, interromperà il recente cronometro figlio e il cronometro globale e restituirà lo strumento temporale corrente.

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

Passaggio 5: stampare il contenuto dello strumento del tempo.

Stampare il contenuto dello strumento del tempo corrente utilizzando il print() metodo.

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

Esempio

L'esempio seguente mostra la creazione di profili utilizzando la classe Profiler di SLF4J. Qui abbiamo preso due attività di esempio, stampando la somma dei quadrati dei numeri da 1 a 10000, stampando la somma dei numeri da 1 a 10000. Stiamo cercando di ottenere il tempo impiegato per queste due attività.

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

Produzione

Al momento dell'esecuzione, il programma di cui sopra genera il seguente output:

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.

Registrazione delle informazioni del profiler

Invece di stampare il risultato di un profiler per registrare queste informazioni, è necessario:

  • Crea un logger usando il LoggerFactory classe.

  • Crea un profiler creando un'istanza della classe Profiler.

  • Associa il logger al profiler passando l'oggetto logger creato al file setLogger() metodo del Profiler classe.

  • Infine, invece di stampare il log le informazioni del profiler utilizzando il file log() metodo.

Esempio

Nell'esempio seguente, a differenza del precedente (invece di stampare), stiamo cercando di registrare il contenuto dello strumento del 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();
   }
}

Produzione

Al momento dell'esecuzione, il programma di cui sopra genera il seguente output.

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