我有这段代码来连接一些数组元素:
StringBuilder sb = new StringBuilder();
private RatedMessage joinMessage(int step, boolean isresult) {
sb.delete(0, sb.length());
RatedMessage rm;
for (int i = 0; i <= step; i++) {
if (mStack[i] == null)
continue;
rm = mStack[i].getCurrentMsg();// msg is built upfront, this just returns, it's a getter method call
if (rm == null || rm.msg.length() == 0)
continue;
if (sb.length() != 0) {
sb.append(", ");
}
sb.append(rm.msg);
}
rm.msg=sb.toString();
return rm;
}重要的是,该数组最多可以容纳10个项目,所以它不是很多。
我的跟踪输出告诉我这个方法被调用了18864次,16%的运行时间都花在了这个方法上。我可以优化更多吗?
发布于 2010-05-26 04:51:08
一些想法:
1)您是否使用预估的最大容量初始化StringBuilder?这可以节省花费在内部数组重新分配和复制上的时间。
2)也许您可以在循环中附加一个结尾的逗号,并避免循环中的字符串长度条件。相反,应在方法的末尾添加一个条件,并根据需要删除尾随的逗号。
发布于 2010-05-26 04:40:29
首先,我不会重用StringBuilder,总是创建新的实例。这肯定会更快,因为它将允许GC使用年轻一代的堆区域。
另一个可以消除至少一个if语句的小技巧是重写代码,如下所示:
String separator = "";
for (int i = 0; i <= step; i++) {
...
sb.append(separator);
sb.append(rm.msg);
separator = ", ";
}发布于 2010-05-26 04:44:36
您可以进行以下更改(仅显示差异):
String separator = "";
for (int i = 0; i <= step; i++) {
// ...
sb.append(separator).append(rm.msg);
separator = ", ";
}如果额外的if重复9次,它就会被删除,代价是添加一次空字符串。在决定保留此更改之前,您应该衡量它是否对您正在使用的数据有任何帮助:-)
https://stackoverflow.com/questions/2908307
复制相似问题