-2
String prefix = "";
for (String serverId : serverIds) {
  sb.append(prefix);
  prefix = ",";
  sb.append(serverId);
}

次のコードは、上記のコードよりも高速に実行されます。「、」接頭辞オブジェクトは、反復ごとに不要なオブジェクトを作成します。上記のコードは 86324 ナノ秒かかりますが、私のものは 68165 ナノ秒しかかかりません。

List<String> l =  Arrays.asList("SURESH1","SURESH2","SURESH4","SURESH5");
StringBuffer  l1 = new StringBuffer();
int sz = l.size(); 
int i=0; long t =
System.nanoTime();
for (String s : l)
{ 
   l1.append(s);     
   if  ( i != sz-1)
        l1.append(",");   i++;
   } 
} 
long t2 = System.nanoTime();
System.out.println ((t2-t)); System.out.println(l1);

// The time taken for the above code is 68165 nano seconds
SURESH1,SURESH2,SURESH4,SURESH5

あなたの見解でどちらが優れているか教えてください。

4

2 に答える 2

2

いくつかのポイント:

  • 私のコードでは、事前に要素の数を知る必要はありません。言い換えれば、それはどんなものでも機能することができますIterable<String>
  • StringBufferではなく、なぜまったく使用しているのStringBuilderですか?
  • 「空の接頭辞オブジェクト」は一度だけ作成されます...コードのどこにも空の文字列リテラルへの参照がないことをどのように確信していますか?
  • どのコードが読みやすいと思いますか? ほとんどの場合、これはタイミングよりも重要である可能性があります。(現在、投稿されたコードには、十分な開き括弧がないようです。たとえば...)
  • そもそもライブラリメソッドを使用しないのはなぜですか (例: Guava のJoinerクラス)。
  • ベンチマークでこれほど小さいタイミングを使用しないでください。システムクロックはどのくらい正確だと思いますか? 十分な時間がかかるまで、同じ操作を何度も繰り返す必要があります。

編集:最初のポイントに対処する1つの代替案は、次の変更です。

boolean first = true;
StringBuilder builder = new StringBuilder();
for (String value : values) {
  if (first) {
    first = false;
  } else {
    builder.append(",");
  }
  builder.append(value);
}

または、カウンターの使用が本当に好きな場合:

int i = 0;
StringBuilder builder = new StringBuilder();
for (String value : values) {
  if (i != 0) {
    builder.append(",");
  }
  builder.append(value);
  i++;
}
于 2010-08-03T14:16:21.023 に答える
0

また、ベンチマークのコーディングと実行の方法についても深刻な疑問を抱いています。まず、タイミングは、コードが JIT コンパイルされていないことを示しています。結果を無効にする可能性のある Java ベンチマークで多くの人が犯す間違いがあります。完全なコードを見せてください。

もう 1 つのポイントは、ほとんどの場合、この種のマイクロ最適化は実際のプログラムのパフォーマンスとは無関係であるということです。プログラムがすでに十分に高速に実行されているか、プログラムの間違った部分を最適化して時間を無駄にしています。

于 2010-08-03T14:40:46.940 に答える