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

Следующий код работает быстрее, чем приведенный выше код. префиксный объект «,» делает ненужное создание объекта на каждой итерации. Приведенный выше код занимает 86324 nano секунд, а мой занимает всего 68165 nano секунд.Удалить разделитель, в конце

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 

любезно сообщите мне, какой из них лучше ур.

+0

Возможный дубликат [(java) Удалить последний символ StringBuilder?] (Http://stackoverflow.com/questions/3395286/java-remove-last-character-of-a-stringbuilder) –

+0

Ой, ошибочно закрыть голос. –

+0

@ jon skeet, я знаю, что это дубликат, никто не отвечает, поэтому создавайте новые, извиняйтесь. дайте мне знать, какой код работает быстрее. –

ответ

2

Несколько моментов:

  • Мой код не требует, чтобы вы знали количество элементов до фронта. Другими словами, он может работать над любыми Iterable<String>
  • Почему вы используете StringBuffer, а не StringBuilder?
  • «Пустой префиксный объект» создается только один раз ... насколько вы уверены, что нет ссылок на пустой строковый литерал в любом месте вашего кода?
  • Какой код вы считаете более простым для чтения? Вероятнее всего, это будет более важно, чем время в большинстве случаев. (В настоящее время у вашего кода в том виде, в каком он был опубликован, как представляется, недостаточно иметь открытые фигурные скобки, например ...)
  • Почему бы не использовать метод библиотеки в первую очередь (например, класс Guava Joiner)?
  • Никогда не используйте тайминги этого небольшого теста. Насколько точны ожидаемые системные часы? Вы должны повторить одну и ту же операцию многих, многие, пока не пройдет разумное количество времени.

EDIT: Теперь одна альтернатива, которая обращается к первой точке будет это изменение:

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++; 
} 
+0

спасибо за советы. извините "," не создается на каждой итерации, это относится к тому же пулу строк. –

+0

skeet Я повторил это с 80 000 элементов, но мой код работает быстрее. –

+0

@Suresh S: Даже с 80 000 значений я все еще подозреваю ... сколько времени занимает в абсолютном выражении? Я возьму любой результат менее секунды с щепоткой соли. Существуют различные другие вещи, которые могут пойти не так, как с бенчмаркингом ... мы должны были бы видеть, что ваш полный код должен сказать точно. –

0

У меня также есть серьезные сомнения как вы закодировали и выполняете свои тесты. Для начала ваши тайминги предполагают, что ваш код не получил JIT. Есть много ошибок, которые люди делают с помощью тестов Java, которые могут привести к недействительности результатов. Покажите нам полный код.

Другое дело, что в большинстве случаев такая микро-оптимизация не имеет отношения к производительности реальных программ. Либо программа уже работает достаточно быстро, либо вы тратите свое время на оптимизацию неправильной части программы.

Смежные вопросы