📅  最后修改于: 2020-11-11 05:13:43             🧑  作者: Mango
SLF4J发行版提供了slf4j-ext.jar,其中包含用于性能分析,扩展日志记录,事件日志记录以及使用Java代理进行日志记录等功能的API。
有时,程序员想衡量一些属性,例如内存的使用,时间复杂度或有关程序的特定指令的使用,以衡量该程序的实际功能。这种有关程序的度量称为概要分析。分析使用动态程序分析来进行此类测量。
SLF4J在org.slf4j.profiler包中提供了一个名为Profiler的类,用于进行分析。这就是所谓的穷人档案。使用此功能,程序员可以找出执行长时间任务所需的时间。
探查器包含秒表和子秒表,我们可以使用探查器类提供的方法来启动和停止它们。
要使用事件探查器类进行分析,请执行以下步骤。
通过传递表示探查器名称的String值来实例化探查器类。当我们实例化Profiler类时,将启动全局秒表。
//Creating a profiler
Profiler profiler = new Profiler("Sample");
当我们调用start()方法时,它将启动一个新的子秒表(名为),并停止更早的子秒表(或时间工具)。
通过传递表示要创建的子秒表名称的String值来调用Profiler类的start()方法。
//Starting a child stopwatch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
创建完这些秒表之后,您可以执行任务,或者调用那些运行任务的方法。
如果需要,请使用start()方法创建另一个秒表并执行所需的任务。如果这样做,它将启动一个新的秒表并停止上一个秒表(即任务1)。
//Starting another child stopwatch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
当我们调用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类来创建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