興味があるだけですが、どちらがより効率的ですか?
これ:
String a = someString + "." + anotherString;
またはこれ:
String a = someString + '.' + anotherString;
興味があるだけですが、どちらがより効率的ですか?
これ:
String a = someString + "." + anotherString;
またはこれ:
String a = someString + '.' + anotherString;
とのコードを見るStringBuilder.appendと、「。」AbstractStringBuilder.appendが期待できます。より速くなるために形。
基本的には、やることはほとんどありません。
しかし、他のみんなと同じように、実際のアプリケーションコードでは違いが重要になるとは思いません。
Javaコンパイラが、追加されているのが長さ1の定数文字列であることを認識し、代わりに文字リテラルに変換することが有効かどうか、または有効であってもわざわざ変換するかどうかはわかりません。 。
それらはかなり似ています。'.'わずかに高速ですが、違いはごくわずかです (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 を内部的に使用しています。
Java コンパイラは、任意の文字列連結式を StringBuilder 操作の同等のシーケンスに変換します。シーケンスが最適に近いと想定しても安全です。実際、この特定の例では、どちらの場合も同じ (最適な) シーケンスが生成されると期待しています。しかし、そうでない場合でも、その差は小さい可能性があります。
プロファイラーが特定のステートメントがコードのボトルネックであると通知した場合にのみ、この種のことを気にする価値があります。時期尚早の最適化は (せいぜい) 無意味であり、有害でさえあります。
Sun 関係者のアドバイスは、Java コードを手作業で最適化すると、実際にはコードが遅くなる可能性があるというものです。これは、結果のバイトコード シーケンスが複雑になりすぎて、JIT コンパイラが適切に最適化できなくなるためです。最良のアドバイスは、コードを単純に記述し、Javac および JIT コンパイラーがうまく機能することを信頼することです。