SLF4J剖析(Profiler)


SLF4J分發提供了slf4j-ext.jar,它包含用於分析,擴充套件紀錄檔記錄,事件紀錄檔記錄和使用java代理進行紀錄檔記錄等功能的API。

剖析

有時,程式員想要測量一些屬性,如使用記憶體,時間複雜度或使用有關程式的特定指令來測量程式的實際能力。關於程式的這種測量稱為剖析。分析使用動態程式分析來進行此類測量。

SLF4J在org.slf4j.profiler包中提供了一個Profiler類,用於剖析目的。使用它,程式員可以找出執行長時間任務所需的時間。

使用Profiler類剖析

Profiler類包含秒錶和子秒表,我們可以使用Profiler類提供的方法啟動和停止這些。

要使用Profiler類類繼續進行效能分析,請按照下面給出的步驟進行操作。

第1步 - 範例化Profiler類

通過傳遞表示profiler名稱的字串值來範例化Profiler類。當範例化Profiler類時,將啟動一個全域性秒表。如下範例程式碼:

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

第2步 - 啟動秒表

當呼叫start()方法時,它將啟動一個新的秒表(命名),並停止早期的秒表(或時間工具)。

通過傳遞表示要建立的秒表名稱的String值來呼叫Profiler類的start()方法。

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

建立這些秒表後,可以執行任務或呼叫執行任務的那些方法。

第3步:啟動另一個秒表

如果需要,使用start()方法建立另一個秒表並執行所需的任務。它將啟動一個新的秒表並停止前一個(即任務1)。

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

第4步:停止秒表

當呼叫stop()方法時,它將停止最近的秒表和全域性秒表並返回當前的時間工具。

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

第5步:列印時間儀器的內容。

使用print()方法列印當前時間儀器的內容。

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

範例

以下範例演示了使用SLF4J的Profiler類進行效能分析。在這裡,我們採取了兩個範例任務,列印從1到10000數位的平方,以及列印數位從1到10000的總和。嘗試為這兩個任務獲取時間。

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

執行上面範例程式碼,得到以下結果:

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.

記錄Profiler資訊

不需要列印探查器的結果來記錄此資訊,而是 -

  • 使用LoggerFactory類建立記錄器。
  • 通過範例化Profiler類來建立分析器。
  • 通過將建立的記錄器物件傳遞給Profiler類的setLogger()方法,將記錄器與分析器相關聯。
  • 最後,不使用log()方法列印探查器的資訊。

範例

在下面的範例中,與前一個範例(而不是列印)不同,這裡要記錄時間工具的內容。

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

執行上面範例程式碼,得到以下結果:

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