1. ホーム

[解決済み】log4jで、ログを取る前にisDebugEnabledをチェックすると、パフォーマンスが向上する?

2022-04-05 09:48:05

質問

を使っています。 Log4J をロギング用アプリケーションに追加しました。以前は、次のようなデバッグコールを使っていました。

オプション1:

logger.debug("some debug text");

をチェックした方が良いというリンクもあります。 isDebugEnabled() というように、最初に

オプション 2:

boolean debugEnabled = logger.isDebugEnabled();
if (debugEnabled) {
    logger.debug("some debug text");
}

そこで質問なのですが、" オプション2は、何らかの形でパフォーマンスを向上させるのでしょうか? "です。

なぜなら、どのような場合でもLog4JフレームワークはdebugEnabledに対して同じチェックを持っているからです。オプション2については、もし私たちが単一のメソッドまたはクラスで複数のデバッグステートメントを使用している場合、それは有益かもしれません。 isDebugEnabled() メソッドを複数回(呼び出しのたびに)呼び出します。 isDebugEnabled() メソッドは一度だけで、Log4Jがデバッグレベルに設定されている場合、実際には isDebugEnabled() メソッドを2回実行します。

  1. 変数debugEnabledに値を代入する場合、および
  2. 実際にlogger.debug()メソッドから呼び出される。

複数の logger.debug() ステートメントをメソッドやクラス内で呼び出し debug() メソッドを使用する場合、オプション2と比較して、Log4Jフレームワークのオーバーヘッドになります。そのため isDebugEnabled() は非常に小さなメソッドなので(コードの観点から)、インライン化の良い候補になるかもしれません。

解決方法は?

この場合、オプション1が適しています。

ガード文(チェック isDebugEnabled() を呼び出すときに、ログメッセージの計算が高くつくことを防ぐためにあります。 toString() メソッドを実行し、その結果を連結しています。

この例では、ログメッセージは定数文字列なので、ロガーに捨てさせることは、ロガーが有効かどうかをチェックするのと同じくらい効率的で、分岐が少ないのでコードの複雑さも軽減されます。

より良い方法は、ログステートメントがフォーマットの指定とロガーによって置換される引数のリストを取るが、ロガーが有効である場合にのみ "遅延," を行う、より最新のロギングフレームワークを使用することです。これは、次のようなアプローチです。 スルフ4j .

参照 関連する質問に対する私の回答 をご覧ください。また、log4jでこのようなことを行う例もあります。