119

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

slf4j の例

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

それ以外の

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

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

4

6 に答える 6

81

文字列連結性能についてです。高密度のログ ステートメントがある場合、潜在的に重要です。

(SLF4J 1.7 より前) ただし、2 つのパラメーターのみが可能です。

ロギング ステートメントの大部分は 2 つ以下のパラメーターを持つため、バージョン 1.6 までの SLF4J API は、ユース ケースの大部分 (のみ) をカバーします。API 設計者は、API バージョン 1.7 以降、varargs パラメーターを使用してオーバーロードされたメソッドを提供してきました。

2 つ以上が必要で、1.7 より前の SLF4J に行き詰まっている場合は、文字列連結またはnew Object[] { param1, param2, param3, ... }. パフォーマンスがそれほど重要ではないほど、それらの数は少ないはずです。

于 2012-05-11T16:49:45.847 に答える
52

短いバージョン:はい、より少ないコードで高速です!

文字列の連結は、必要かどうかを知らずに多くの作業を行います (log4j で知られている従来の「デバッグが有効になっている」テスト)。{} を使用すると toString() 呼び出しと文字列の作成を遅らせることができるため、可能であれば避ける必要があります。イベントのキャプチャが必要かどうかが決定された後。私の意見では、ロガーを単一の文字列にフォーマットすることで、コードがきれいになります。

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

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

于 2012-05-15T07:52:07.307 に答える
3

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

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

それははるかに保守性と拡張性があります。その上、翻訳も簡単です。

于 2012-10-05T06:36:49.457 に答える
2

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

/**
* <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);
于 2018-09-12T21:59:46.830 に答える