📜  SLF4J-分析

📅  最后修改于: 2020-11-11 05:13:43             🧑  作者: Mango


SLF4J发行版提供了slf4j-ext.jar,其中包含用于性能分析,扩展日志记录,事件日志记录以及使用Java代理进行日志记录等功能的API。

剖析

有时,程序员想衡量一些属性,例如内存的使用,时间复杂度或有关程序的特定指令的使用,以衡量该程序的实际功能。这种有关程序的度量称为概要分析。分析使用动态程序分析来进行此类测量。

SLF4J在org.slf4j.profiler包中提供了一个名为Profiler的类,用于进行分析。这就是所谓的穷人档案。使用此功能,程序员可以找出执行长时间任务所需的时间。

使用Profiler类进行分析

探查器包含秒表和子秒表,我们可以使用探查器类提供的方法来启动和停止它们。

要使用事件探查器类进行分析,请执行以下步骤。

第1步-实例化探查器类

通过传递表示探查器名称的String值来实例化探查器类。当我们实例化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.

记录探查器信息

无需打印分析器的结果来记录此信息,您需要-

  • 使用LoggerFactory类创建一个记录器。

  • 通过实例化Profiler类来创建Profiler。

  • 通过将创建的记录器对象传递给Profiler类的setLogger()方法,将记录器与Profiler关联。

  • 最后,代替使用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