【问题标题】:Remove the delimiter , at the end去掉分隔符,最后
【发布时间】:2010-08-03 14:11:39
【问题描述】:
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

请告诉我你认为哪个更好。

【问题讨论】:

标签: java premature-optimization


【解决方案1】:

几点:

  • 我的代码不需要您预先知道元素的数量。换句话说,它可以在任何Iterable&lt;String&gt; 上工作
  • 你为什么要使用StringBuffer而不是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++;
}

【讨论】:

  • 感谢您的提示。抱歉,“,”不是每次迭代都创建的,它指的是同一个字符串池。
  • skeet 我用 80,000 个元素重复了此操作,但我的代码运行速度更快。
  • @Suresh S:即使有 80,000 个值,我仍然会怀疑……绝对值需要多长时间?我会用一小撮盐在不到一秒钟的时间内得出任何结果。基准测试还有很多其他问题可能会出错......我们必须看到你的完整代码才能确定。
  • skeet 感谢修改后的代码。布尔值比其他值运行得更快,来自 Eclipse 的 TPTP 插件显示以下结果docs.google.com/…
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2014-03-14
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多