1

興味があるだけですが、どちらがより効率的ですか?

これ:

String a = someString + "." + anotherString;

またはこれ:

String a = someString + '.' + anotherString;
4

4 に答える 4

12

とのコードを見るStringBuilder.appendと、「。」AbstractStringBuilder.append期待できます。より速くなるために形。

基本的には、やることはほとんどありません。

  • charをnullにすることはできないため、nullityチェックを行う必要はありません。
  • 追加されている空の文字列の最適化を行おうとはしません
  • 追加する長さをフェッチする必要はありません-常に1になります
  • 単一の反復ループではなく、配列への単一の割り当てを実行するだけで済みます

しかし、他のみんなと同じように、実際のアプリケーションコードでは違いが重要になるとは思いません。

Javaコンパイラが、追加されているのが長さ1の定数文字列であることを認識し、代わりに文字リテラルに変換することが有効かどうか、または有効であってもわざわざ変換するかどうかはわかりません。 。

于 2009-11-16T07:23:25.200 に答える
6

それらはかなり似ています。'.'わずかに高速ですが、違いはごくわずかです (1000 万ループで約 20 ミリ秒)。

これが私のテストです:

$cat UsingC.java  UsingS.java  
public class UsingC { 
    public static void main( String [] args ) { 
        String someString  = "";
        String anotherString = "";

        int i = 0;
        while( i++ < 10000000 ) { 
            String a = someString + '.' + anotherString;
        }
    }
}
public class UsingS{ 
    public static void main( String [] args ) { 
        String someString  = "";
        String anotherString = "";

        int i = 0;
        while( i++ < 10000000 ) { 
            String a = someString + "." + anotherString;
        }
    }
}
$for i in 1 2 3 4 5 ; do time java UsingC; done

real    0m1.643s
user    0m1.424s
sys 0m0.108s

real    0m1.670s
user    0m1.468s
sys 0m0.056s

real    0m2.023s
user    0m1.448s
sys 0m0.080s

real    0m1.669s
user    0m1.432s
sys 0m0.088s

real    0m1.674s
user    0m1.416s
sys 0m0.104s
$for i in 1 2 3 4 5 ; do time java UsingS; done

real    0m2.344s
user    0m1.584s
sys 0m0.136s

real    0m2.057s
user    0m1.640s
sys 0m0.084s

real    0m2.112s
user    0m1.732s
sys 0m0.072s

real    0m2.482s
user    0m1.704s
sys 0m0.108s

real    0m2.134s
user    0m1.788s
sys 0m0.072s

平均を実行したり、より複雑なテストを作成したりできます。

いずれにせよ、どちらも StringBuilder を内部的に使用しています。

于 2009-11-16T07:52:19.620 に答える
1

Java コンパイラは、任意の文字列連結式を StringBuilder 操作の同等のシーケンスに変換します。シーケンスが最適に近いと想定しても安全です。実際、この特定の例では、どちらの場合も同じ (最適な) シーケンスが生成されると期待しています。しかし、そうでない場合でも、その差は小さい可能性があります。

プロファイラーが特定のステートメントがコードのボトルネックであると通知した場合にのみ、この種のことを気にする価値があります。時期尚早の最適化は (せいぜい) 無意味であり、有害でさえあります。

Sun 関係者のアドバイスは、Java コードを手作業で最適化すると、実際にはコードが遅くなる可能性があるというものです。これは、結果のバイトコード シーケンスが複雑になりすぎて、JIT コンパイラが適切に最適化できなくなるためです。最良のアドバイスは、コードを単純に記述し、Javac および JIT コンパイラーがうまく機能することを信頼することです。

于 2009-11-16T07:12:55.060 に答える