SLF4J - Profilerstellung

SLF4J Distribution bietet slf4j-ext.jar Diese enthält APIs für die Funktionen wie Profilerstellung, Erweiterte Protokollierung, Ereignisprotokollierung und Protokollierung mit Java Agent.

Profilerstellung

Manchmal möchte der Programmierer einige Attribute wie die Verwendung des Speichers, die Zeitkomplexität oder die Verwendung bestimmter Anweisungen zu den Programmen messen, um die tatsächliche Leistungsfähigkeit dieses Programms zu messen. Eine solche Messung des Programms wird als Profiling bezeichnet. Die Profilerstellung verwendet eine dynamische Programmanalyse, um solche Messungen durchzuführen.

SLF4J bietet eine Klasse mit dem Namen Profiler in dem org.slf4j.profilerPaket für Profilierungszwecke. Dies ist als Profiler des armen Mannes bekannt. Auf diese Weise kann der Programmierer die Zeit ermitteln, die für die Ausführung längerer Aufgaben benötigt wird.

Profilerstellung mit der Profiler-Klasse

Der Profiler enthält Stoppuhren und untergeordnete Stoppuhren, und wir können diese mit den von der Profiler-Klasse bereitgestellten Methoden starten und stoppen.

Führen Sie die folgenden Schritte aus, um mit der Profilerstellung mithilfe der Profiler-Klasse fortzufahren.

Schritt 1 - Instanziieren Sie die Profiler-Klasse

Instanziieren Sie die Profiler-Klasse, indem Sie einen String-Wert übergeben, der den Namen des Profilers darstellt. Wenn wir eine Profiler-Klasse instanziieren, wird eine globale Stoppuhr gestartet.

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

Schritt 2 - Starten Sie eine Kinderstoppuhr

Wenn wir das aufrufen start() Methode startet es eine neue untergeordnete Stoppuhr (benannt) und stoppt die früheren untergeordneten Stoppuhren (oder Zeitinstrumente).

Rufen Sie die start() Methode der Profiler Klasse durch Übergabe eines String-Werts, der den Namen der zu erstellenden untergeordneten Stoppuhr darstellt.

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

Nach dem Erstellen dieser Stoppuhren können Sie Ihre Aufgaben ausführen oder die Methoden aufrufen, mit denen Ihre Aufgaben ausgeführt werden.

Schritt 3: Starten Sie eine weitere Kinderstoppuhr (wenn Sie möchten)

Erstellen Sie bei Bedarf eine weitere Stoppuhr mit der start()Methode und führen Sie die erforderlichen Aufgaben. Wenn Sie dies tun, wird eine neue Stoppuhr gestartet und die vorherige gestoppt (dh Aufgabe 1).

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

Schritt 4: Stoppen Sie die Uhren

Wenn wir das aufrufen stop() Methode stoppt es die letzte untergeordnete Stoppuhr und die globale Stoppuhr und gibt das aktuelle Zeitinstrument zurück.

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

Schritt 5: Drucken Sie den Inhalt des Zeitinstruments.

Drucken Sie den Inhalt des aktuellen Zeitinstruments mit der print() Methode.

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

Beispiel

Das folgende Beispiel zeigt die Profilerstellung mit der Profiler-Klasse von SLF4J. Hier haben wir zwei Beispielaufgaben ausgeführt: Drucken der Quadratsumme der Zahlen von 1 bis 10000 und Drucken der Summe der Zahlen von 1 bis 10000. Wir versuchen, die für diese beiden Aufgaben benötigte Zeit zu ermitteln.

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

Ausgabe

Bei der Ausführung generiert das obige Programm die folgende Ausgabe:

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.

Protokollierung der Profiler-Informationen

Anstatt das Ergebnis eines Profilers zu drucken, um diese Informationen zu protokollieren, müssen Sie -

  • Erstellen Sie einen Logger mit dem LoggerFactory Klasse.

  • Erstellen Sie einen Profiler, indem Sie die Profiler-Klasse instanziieren.

  • Verknüpfen Sie den Logger mit dem Profiler, indem Sie das erstellte Logger-Objekt an das übergeben setLogger() Methode der Profiler Klasse.

  • Anstatt zu drucken, protokollieren Sie schließlich die Informationen des Profilers mit dem log() Methode.

Beispiel

Im folgenden Beispiel versuchen wir im Gegensatz zum vorherigen (anstatt zu drucken), den Inhalt des Zeitinstruments zu protokollieren.

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

Ausgabe

Bei der Ausführung generiert das obige Programm die folgende Ausgabe.

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