割り当ての文字列の連結は、効率的ですか?

MetallicPriest:

私は、文字列を構築するための「+」連結演算子を使用すると、非常に非効率的であることを知って、それはStringBuilderクラスを使用することをお勧めしている理由であるが、この種のパターンがあまりにも非効率的である場合、私は不思議でしたか?

String some = a + "\t" + b + "\t" + c + "\t" + d + "\t" + e;

私は、コンパイラが割り当て罰金を最適化するか、しません、ここで推測しますか?

チャールズDowbecki:

この特定の例では、コンパイラによってインライン化されます。

String a = "a";
String b = "bb";
String c = "ccc";
String some = a + "\t" + b + "\t" + c;

Javaの9+が使用して、これをインライン化しますmakeConcatWithConstantsとinvokedynamicのそれを効率的にします。あたりとしてjavap -v出力:

Code:
  stack=3, locals=5, args_size=1
     0: ldc           #2                  // String a
     2: astore_1
     3: ldc           #3                  // String bb
     5: astore_2
     6: ldc           #4                  // String ccc
     8: astore_3
     9: aload_1
    10: aload_2
    11: aload_3
    12: invokedynamic #5,  0              // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    17: astore        4
    19: return

しかしもしa bc、さらにコードを最適化するコンパイラのコンパイル時定数であります:

final String a = "a";
final String b = "bb";
final String c = "ccc";
String some = a + "\t" + b + "\t" + c;

そしてsome一定の値がロードされます。

Code:
  stack=1, locals=5, args_size=1
     0: ldc           #2                  // String a
     2: astore_1
     3: ldc           #3                  // String bb
     5: astore_2
     6: ldc           #4                  // String ccc
     8: astore_3
     9: ldc           #5                  // String a\tbb\tccc
    11: astore        4
    13: return

他の事情などでforループコンパイラが最適化されたコードを生成することができない場合がありますので、StringBuilder速いかもしれません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=221975&siteId=1