SLF4J - 分析

  • 简述

    SLF4J 发行版提供 slf4j-ext.jar 这包含用于分析、扩展日志记录、事件日志记录和使用 Java 代理进行日志记录等功能的 API。
  • 剖析

    有时,程序员想要测量一些属性,例如内存的使用、时间复杂度或有关程序的特定指令的使用情况,以测量该程序的实际能力。这种对程序的测量称为性能分析。Profiling 使用动态程序分析来进行此类测量。
    SLF4J 提供了一个名为的类 Profiler 在里面 org.slf4j.profiler用于分析目的的包。这被称为穷人的剖析器。使用它,程序员可以找出执行长时间任务所需的时间。
  • 使用 Profiler 类进行分析

    分析器包含监控和子监控,我们可以使用分析器类提供的方法启动和停止它们。
    要使用分析器类进行分析,请按照以下步骤操作。

    步骤 1 - 实例化分析器类

    通过传递表示探查器名称的字符串值来实例化探查器类。当我们实例化一个 Profiler 类时,将启动一个全局监控。
    
    //Creating a profiler
    Profiler profiler = new Profiler("Sample");
    

    第 2 步 - 启动子监控

    当我们调用 start() 方法它将启动一个新的子监控(命名),并停止较早的子监控(或时间仪器)。
    调用 start() 的方法 Profiler 通过传递一个字符串值来表示要创建的子监控的名称。
    
    //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();
    

    第五步:打印时间仪器的内容。

    使用 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 类来创建一个探查器。
    • 通过将创建的 logger 对象传递给 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