Удалить разделитель, в конце - PullRequest
0 голосов
/ 03 августа 2010
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

пожалуйста, дайте мне знать, какая из них лучше в вашем представлении.

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

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

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

РЕДАКТИРОВАТЬ: Теперь одна альтернатива, которая касается первого пункта, будет это изменение:

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 голосов
/ 03 августа 2010

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

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

...