-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>
  • 你为什么使用StringBufferat all 而不是StringBuilder
  • “空前缀对象”仅创建一次……您如何确定代码中的任何地方都没有对空字符串文字的任何引用?
  • 你觉得哪个代码更容易阅读?在大多数情况下,这可能比时间安排更重要。(目前,您发布的代码似乎没有足够的大括号,例如......)
  • 为什么不首先使用库方法(例如 Guava 的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++;
}
于 2010-08-03T14:16:21.023 回答
0

我也非常怀疑您编写和运行基准测试的方式。首先,您的时间表明您的代码没有得到 JIT 编译。人们在使用 Java 基准测试时会犯许多错误,这些错误会使结果无效。向我们展示完整的代码。

另一点是,在大多数情况下,这种微优化与实际程序的性能无关。要么程序已经运行得足够快,要么你在浪费时间优化程序的错误部分。

于 2010-08-03T14:40:46.940 回答