4

Preconditions私たちのコードでは、引数を次のようにチェックすることがよくあります。

Preconditions.checkArgument(expression, "1" + var + "3");

しかし、このコードは非常に頻繁に呼び出されることがあります。これは、パフォーマンスに顕著な悪影響を与える可能性がありますか? 切り替えるべきか

Preconditions.checkArgument(expression, "%s%s%s", 1, var, 3);

?

(ほとんどの場合、条件が true になると思います。false はバグを意味します。)

4

3 に答える 3

5

ほとんどの場合、チェックで例外がスローされないと予想される場合は、文字列連結を使用する理由はありません。例外をスローしていることを確認してからメソッドを呼び出すよりも、メソッドを呼び出す前に(.concatまたはを使用して) 連結する方が時間がかかります。StringBuilder

逆に、例外をスローしている場合は、既に遅いブランチにいます。

また、Guava はカスタムで高速なフォーマッターを使用し、%s. したがって、時間の損失は、実際には標準のロガー{}ハンドル (slf4j または log4j 2) に似ています。しかし、上に書いたように、これはあなたがすでに遅いブランチにいる場合です。

いずれにせよ、私はあなたの提案に反対することを強くお勧めしますが、代わりにこれを使用します:

Preconditions.checkArgument(expression, "1%s3", var);

%s限界速度を得るために定数ではなく、変数のみを に配置する必要があります。

于 2015-10-14T08:09:11.320 に答える
1

リテラル連結の場合String、コンパイラはコンパイル時にこれを行う必要があるため、実行時のパフォーマンス ヒットは発生しません。少なくとも標準の JDK はこれを行いますが、これは仕様によるものではありません (したがって、一部のコンパイラこれを最適化しない場合があります)。

変数の場合、定数の折りたたみは機能しないため、実行時に作業が行われます。ただし、新しい Java コンパイラは、文字列の連結を に置き換えます。StringBuilderこれは、 とは異なり不変ではないため、より効率的Stringです。

これは、呼び出された場合、フォーマッタを使用するよりも高速です。ただし、非常に頻繁に呼び出されることを例外としていない場合は、引数が true の場合でも連結が常に発生し、メソッドが何もしないため、これは遅くなる可能性があります。

とにかく、まとめとして、既存の呼び出しを書き直す価値があるとは思いません。ただし、新しいコードでは、間違いなくフォーマッタを使用できます。

于 2015-10-14T07:21:39.713 に答える