Performance Log4J意外的性能提高

Performance Log4J意外的性能提高,performance,log4j,Performance,Log4j,在将日志打包到一个单独的类中时,我们体验到了性能的提高,这是我们无法解释的 如果有人可以发表评论来帮助我们理解这一点 这里是主线: package myapp; import myapp.logging.Log; import org.apache.log4j.Logger; public class ApplicationMain extends Thread { private static Logger LOG = Logger.getLogger(ApplicationMain.c

在将日志打包到一个单独的类中时,我们体验到了性能的提高,这是我们无法解释的

如果有人可以发表评论来帮助我们理解这一点

这里是主线:

package myapp;

import myapp.logging.Log;

import org.apache.log4j.Logger;

public class ApplicationMain extends Thread {
private static Logger LOG = Logger.getLogger(ApplicationMain.class); 

@Override 
public void run() {
for (int i = 0; i < 50; i++) {
    try {
    Thread.sleep(500);

    //traditional plain log4j
    long startTime = System.nanoTime();
    LOG.info("Hello World Log4j");
    long endTime = System.nanoTime();
    System.out.println(endTime - startTime);

    //logging in wrapper
    long startTime2 = System.nanoTime();
    Log.Info("Hello World Log4J from within wrapper");
    long endTime2 = System.nanoTime();
    System.out.println(endTime2 - startTime2);

    } catch (InterruptedException ex) {
    Log.Info(ex.getMessage());
    }
}
}
package myapp.logging;

import org.apache.log4j.Logger;

public class Log {


private static Logger LOG;

public static synchronized void Info(String LogMessage) {

Throwable throwable = new Throwable();
StackTraceElement[] stackTraceElements = throwable.getStackTrace();
LOG = Logger.getLogger(stackTraceElements[1].getClassName());
LOG.info(LogMessage);
}
}
Thread.start()
上,我们得到以下类型的输出:

2013-01-02 10:42:25,359 INFO   [ApplicationMain] Hello World Log4j

191478

2013-01-02 10:42:25,359 INFO   [ApplicationMain] Hello World Log4J from within wrapper 

163852

2013-01-02 10:42:25,859 INFO   [ApplicationMain] Hello World Log4j 

166165

2013-01-02 10:42:25,859 INFO   [ApplicationMain] Hello World Log4J from within wrapper 

85361

2013-01-02 10:42:26,359 INFO   [ApplicationMain] Hello World Log4j 

188694

2013-01-02 10:42:26,359 INFO   [ApplicationMain] Hello World Log4J from within wrapper

82709

.....

为什么包装器执行直接调用?尽管检索调用方类名会增加额外的开销,但我强烈建议大家阅读微基准测试。这是一个非常有趣的话题,我发现这个问题作为一个起点很有用:

本质上,这不是一个有效的性能度量,因为主要围绕编译器优化需要考虑一大堆其他的事情