SLF4J 分析器Profiling
SLF4J Distribution 提供slf4j-ext.jar,其中包含用于分析、扩展日志记录、事件日志记录和 Java 代理日志记录等功能的 API。
SLF4J 分析器Profiling
有时,程序员想要测试一些属性,例如内存的使用、时间复杂度或有关程序的特定指令的使用情况,以测量该程序的实际能力。这种对程序的测试称为性能分析。SLF4J Profiling 使用动态程序分析来进行此类测量。
SLF4J在org.slf4j.profiler包中提供了一个名为Profiler的类用于分析目的。使用它,程序员可以找出执行长时间任务所需的时间。
SLF4J 分析器Profiling的Profiler 类
Profiler 包含秒表和子秒表,我们可以使用分析器类提供的方法启动和停止它们。
要使用分析器类进行分析,请按照以下步骤操作。
第1步:实例化 Profiler 类
通过传递表示探查器名称的字符串值来实例化探查器类。当我们实例化一个 Profiler 类时,将启动一个全局秒表。
//Creating a profiler
Profiler profiler = new Profiler("Sample");
第2步:启动子stopwatch
当我们调用start()方法时,它将启动一个新的stopwatch ,并停止较早的stopwatch (或时间仪器)。
通过传递表示要创建的子秒表名称的字符串值来调用Profiler类的start()方法。
//Starting a child stopwatch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
创建这些秒表后,您可以执行您的任务或调用那些运行您的任务的方法。
第3步:启动另一个子stopwatch
如果需要,使用start()方法创建另一个stopwatch并执行所需的任务。如果您这样做,它将启动一个新的秒表并停止前一个(即任务 1)。
//Starting another child stopwatch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
第4步:停止stopwatch
当我们调用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 分析器Profiling 示例
下面的示例演示了使用 SLF4J 的 Profiler 类的分析。这里我们做了两个示例任务,打印从 1 到 10000 的数字的平方和,打印从 1 到 10000 的数字的总和。我们试图获得这两个任务所用的时间。
package com.yiidian;
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.
记录分析器Profiling的信息
不是打印分析器的结果来记录此信息,您需要
-
使用LoggerFactory类创建记录器。
-
通过实例化 Profiler 类来创建分析器。
-
通过将创建的记录器对象传递给Profiler类的setLogger()方法,将记录器与分析器相关联。
-
最后,使用log()方法而不是打印日志分析器的信息。
记录分析器Profiling的信息 示例
在以下示例中,与前一个示例(而不是打印)不同,我们尝试记录时间工具的内容。
package com.yiidian;
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
热门文章
优秀文章