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