教程 > slf4j 教程 > 阅读:35

slf4j 分析(profiling)——迹忆客-ag捕鱼王app官网

slf4j distribution 提供了 slf4j-ext.jar,其中包含用于分析、扩展日志记录、事件日志记录和使用 java 代理进行日志记录等功能的 api。

分析

有时,程序员想要观测一些属性,例如内存使用、时间复杂度或程序特定指令的使用,从而分析该程序的实际能力。 这种关于程序的测量称为分析。 分析使用动态程序分析来进行这种测量。

slf4j 在 org.slf4j.profiler 包中提供了一个名为 profiler 的类,用于分析目的。 这被称为穷人的分析器。 使用它,程序员可以找出执行长时间任务所花费的时间。

使用 profiler 类

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

要使用 profiler 类继续进行分析,请按照以下步骤操作。

步骤一、初始化 profiler 类

通过传递一个表示 profiler 名称的字符串值来实例化 profiler 类。 当我们实例化一个 profiler 类时,将启动一个全局秒表。

profiler profiler = new profiler("sample");

步骤二、启动子秒表

当我们调用 start() 方法时,它将启动一个新的子秒表(命名)并停止较早的子秒表(或时间仪器)。

通过传递一个表示要创建的子秒表名称的字符串值来调用 profiler 类的 start() 方法。

profiler.start("task 1");
obj.demomethod1();

创建这些秒表后,我们可以执行任务或调用运行任务的方法。

步骤三、启动另一个子秒表(看你是否需要)

如果需要,使用 start() 方法创建另一个秒表并执行所需的任务。 如果这样做,它将启动一个新的秒表并停止前一个秒表(即 task 1)。

profiler.start("task 2");
obj.demomethod2();

步骤四、停止观测

当我们调用 stop() 方法时,它将停止最近的子秒表和全局秒表,并返回当前的timestrument。

timeinstrument tm = profiler.stop();

步骤五、打印 timeinstrument 的内容。

使用 print() 方法打印当前 timestrument 的内容。

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("从 1 到 10000 的平方和: " sum);
   }
   public void demomethod2(){
      int sum = 0;
      for(int i=0; i< 10000; i  ){
         sum = sum i;
      }
      system.out.println("从 1 到 10000 的和: " sum);
   }
   public static void main(string[] args) {
      profilerexample obj = new profilerexample();
      // 创建一个 profiler
      profiler profiler = new profiler("sample");
      // 启动子任务并停止前一个。
      profiler.start("task 1");
      obj.demomethod1();
      // 启动另一个子任务并停止前一个。
      profiler.start("task 2");
      obj.demomethod2();
 
      // 停止当前子观测和全局观测。
      timeinstrument tm = profiler.stop();
      // 打印 timeinstrument 的内容
      tm.print();
   }
}

执行后,上述程序生成以下输出

从 1 到 10000 的平方和: 3.328335e8
从 1 到 10000 的和: 49995000
  profiler [basic]
|-- elapsed time [task 1] 2291.827 microseconds.
|-- elapsed time [task 2] 225.802 microseconds.
|-- total [basic] 3221.598 microseconds.

记录 profiler 信息

我们要记录此信息,而不是打印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("从 1 到 10000 的平方和: " sum);
   }
   public void demomethod2(){
      int sum = 0;
      for(int i=0; i< 10000; i  ){
         sum = sum i;
      }
      system.out.println("从 1 到 10000 的和: " sum);
   }
   public static void main(string[] args) {
      profilerexample_logger obj = new profilerexample_logger();
      logger logger = loggerfactory.getlogger(profilerexample_logger.class);
      profiler profiler = new profiler("sample");
      profiler.setlogger(logger);
      profiler.start("task 1");
      obj.demomethod1();
      profiler.start("task 2");
      obj.demomethod2();
      timeinstrument tm = profiler.stop();
      tm.log();
   }
}

执行后,上述程序会生成以下输出。

从 1 到 10000 的平方和: 3.328335e8
从 1 到 10000 的和: 49995000

查看笔记

扫码一下
查看教程更方便
网站地图