SLF4J 分析(Profiling)
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