Log 4 j使用の効率2

4988 ワード

1、効率
log 4 jはdebugレベルの出力を閉じるが、コードにはlog.Debug(Object msg)の書き方が異なり、3~5倍の時間がかかります.したがって、logを最適化する.debug()このメソッドの呼び出し、log.info()も同じです.
2、log 4 jの最適化の概要
log 4 jは、ログ4 jの初期化時にファイルを開き、プロセスが終了するまでファイルの書き込み制御を維持するなど、多くの最適化を行います.このようにI/Oをオンにする回数を制御します.
他にも最適化があり、大量のキャッシュが使用されています.debugメソッドのソースコードを参照してください.
  public void debug(Object message) {
    if(repository.isDisabled(Level.DEBUG_INT))
      return;
    if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
      forcedLog(FQCN, Level.DEBUG, message, null);
    }
  }

出力レベルをINFOに設定すると、呼び出しdebug()が直接返されます.LOGを使用する.debug(「ビジネスis」+xxxObj)では、仮想マシンがdebugメソッドを実行する前に文字列を接続する必要があります.これが最適化する必要があります.
3、効率コード及びテスト
次は乾物、fuck goods
テストツールクラスTestUtil
package util;

public class TestUtil {
	/**
	 * 
	 *         ,    TestCallBack   execute  
	 * 
	 * @param testCallBack
	 */
	public static long testTime(TestCallBack testCallBack) {
		long begin = System.currentTimeMillis(); //       
		testCallBack.execute(); // /      
		long end = System.currentTimeMillis(); //       
		long cost = (end - begin);
		return cost;
	}
}

コールバック関数
package util;

public interface TestCallBack {
	public void  execute();
}

主クラスのテスト
package util;

import org.apache.log4j.Logger;

import util.TestCallBack;
import util.TestUtil;

public class EfficientTest {
	private final static Logger LOG = Logger.getLogger(EfficientTest.class);
	private final static int MAX_LOOP = 100 * 1000 * 1000;

	/**
	 *     
	 */
	public long log() {
		long cost = TestUtil.testTime(new TestCallBack() {
			@Override
			public void execute() {
				for (int i = 0; i < MAX_LOOP; i++) {
					/**
					 * "test" + "abc" + str   ,         
					 */
					String str = "tt";
					LOG.debug("test" + "abc" + str);
					/**
					 * "test" + "abc"   ,             ,        
					 */
					// LOG.debug("test" + "abc");
				}
			}
		});
		System.out.println("          cost:" + cost);
		return cost;
	}

	/**
	 *     
	 */
	public long logEfficient() {
		long cost = TestUtil.testTime(new TestCallBack() {
			@Override
			public void execute() {
				for (int i = 0; i < MAX_LOOP; i++) {
					if (LOG.isDebugEnabled()) {
						String str = "tt";
						LOG.debug("test" + "abc" + str);
						// LOG.debug("test" + "abc");
					}
				}
			}
		});
		System.out.println("efficient cost:" + cost);
		return cost;
	}

	public static void main(String[] args) {
		EfficientTest test = new EfficientTest();
		for (int i = 0; i <= 9; i++) {
			System.out.println("====        ====" + i);
			if (i % 2 > 0) {
				long log = test.log();
				long logEfficient = test.logEfficient();
				System.out.println("log/logEfficient,"
						+ (((double) log / logEfficient) * 100.0)
						+ "% increase");
			} else {
				long logEfficient = test.logEfficient();
				long log = test.log();
				System.out.println("log/logEfficient,"
						+ (((double) log / logEfficient) * 100.0)
						+ "% increase");
			}
			// System.out.println();
		}
	}
}

log 4 j構成クラス、出力レベルをINFOレベルに調整
log4j.rootCategory=INFO, stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p [%t] %C.%M(%L) | %m%n

実行後の結果
====        ====0
efficient cost:434
          cost:2054
log/logEfficient,473.2718894009216% increase
====        ====1
          cost:1822
efficient cost:434
log/logEfficient,419.8156682027649% increase
====        ====2
efficient cost:394
          cost:1823
log/logEfficient,462.69035532994917% increase
====        ====3
          cost:1805
efficient cost:400
log/logEfficient,451.25% increase
====        ====4
efficient cost:400
          cost:1805
log/logEfficient,451.25% increase
====        ====5
          cost:1790
efficient cost:396
log/logEfficient,452.02020202020196% increase
====        ====6
efficient cost:397
          cost:1798
log/logEfficient,452.89672544080605% increase
====        ====7
          cost:1786
efficient cost:393
log/logEfficient,454.45292620865143% increase
====        ====8
efficient cost:401
          cost:1969
log/logEfficient,491.0224438902743% increase
====        ====9
          cost:1801
efficient cost:392
log/logEfficient,459.4387755102041% increase

最適化の効果は明らかで、DEBUGレベルのログを閉じた後、log.デバグの書き方によって、運転時間が異なります
 
4、類似の方法
を除いて
LOG.isDebugEnabled()

まだ
LOG.isInfoEnabled()

まだ
LOG.isEnabledFor(Priority.DEBUG);

 
 
Log 4 jのHelloWorldはjavaSEの中で入門して1を使います
Log 4 j使用の効率2
Log 4 jの出力フォーマット3
Log 4 jはSystem.out log 4 j出力4を手に入れる