web-dev-qa-db-ja.com

ロガーslf4jの文字列連結ではなく{}でフォーマットする利点

文字列連結の代わりに{}を使用する利点はありますか?

Slf4jの例

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

の代わりに

logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);

構成ファイルによっては、実行時にパラメーターの評価(および文字列の連結)を回避できるため、速度の最適化に関するものだと思います。ただし、2つのパラメーターしか使用できないため、文字列の連結以外に選択肢がない場合があります。この問題に関する意見が必要です。

80
Hernán Eche

It is文字列連結のパフォーマンスについて。ロギングステートメントが密集している場合、潜在的に重要です。

(SLF4J 1.7より前)ただし、2つのパラメーターしか使用できません

ロギングステートメントの大部分は2つ以下のパラメーターを持っているため、バージョン1.6までのSLF4J APIはユースケースの大部分(のみ)をカバーします。 APIデザイナーは、APIバージョン1.7以降、varargsパラメーターを備えたオーバーロードメソッドを提供しています。

2つ以上必要で、1.7より前のSLF4Jで動けない場合は、文字列連結またはnew Object[] { param1, param2, param3, ... }を使用します。パフォーマンスがそれほど重要ではないほど十分に少ない必要があります。

61
skaffman

短いバージョン:はい、コードが少なくて速くなります!

文字列の連結は、必要かどうかを知らずに多くの作業を行い(log4jで知られる従来の「デバッグが有効」テスト)、可能な場合は回避する必要があります。イベントのキャプチャが必要かどうかが決定された後。ロガーのフォーマットをsingle文字列にすることで、私の意見ではコードはよりきれいになります。

引数はいくつでも指定できます。古いバージョンのsljf4jを使用しており、{}に3つ以上の引数がある場合、代わりにnew Object[]{a,b,c,d}構文を使用して配列を渡す必要があることに注意してください。例参照 http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(Java.lang.String、Java.lang.Object [])

速度に関して:Cekiはリストの1つにしばらくベンチマークを投稿しました。

JavaではStringはimmutableであるため、連結のペアごとに左右のStringを新しいStringにコピーする必要があります。だから、プレースホルダーに行く方が良い。

6
Rabin Pantha

別の選択肢はString.format()です。 jcabi-log (slf4jの静的ユーティリティラッパー)で使用しています。

Logger.debug(this, "some variable = %s", value);

はるかに保守性と拡張性に優れています。また、翻訳も簡単です。

3
yegor256

著者の観点から、主な理由は文字列連結のオーバーヘッドを減らすことだと思います。ロガーのドキュメントを読むだけで、次の単語を見つけることができます

/**
* <p>This form avoids superfluous string concatenation when the logger
* is disabled for the DEBUG level. However, this variant incurs the hidden
* (and relatively small) cost of creating an <code>Object[]</code> before 
  invoking the method,
* even if this logger is disabled for DEBUG. The variants taking
* {@link #debug(String, Object) one} and {@link #debug(String, Object, Object) two}
* arguments exist solely in order to avoid this hidden cost.</p>
*/
*
 * @param format    the format string
 * @param arguments a list of 3 or more arguments
 */
public void debug(String format, Object... arguments);
2
Tianhao Wang