ロギングを別のクラスにラップすると、パフォーマンスが向上しましたが、これについては説明できません。
私たちがこれを理解するのを助けるために誰かがおそらくコメントできるとしたら?
メインスレッドは次のとおりです。
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
.....
ラッパーがストレート コールよりもパフォーマンスが優れているのはなぜですか? そして、これは呼び出し元クラス名を取得する追加のオーバーヘッドにもかかわらずですか?