【发布时间】:2018-02-10 02:15:10
【问题描述】:
我很好奇,下面代码sn-p的优化能走多远。
据我所知,每当 StringBuffer 的容量扩展时,都会消耗一些 CPU 工作,因为它的内容需要重新分配。不过,我猜 Java 编译器优化可以预先计算所需的容量,而不是进行多次重新分配。
问题是:下面的sn-p代码会这样优化吗?
public static String getGetRequestURL(String baseURL, Map<String, String> parameters) {
StringBuilder stringBuilder = new StringBuilder();
parameters.forEach(
(key, value) -> stringBuilder.append(key).append("=").append(value).append("&"));
return baseURL + "?" + stringBuilder.delete(stringBuilder.length(),1);
}
【问题讨论】:
-
如何预分配?编译器在运行时对
parameters中的键和值的大小有什么了解? -
StringBuilder直接由char数组支持。如果您使用StringBuilder stringBuilder = new StringBuilder("");代替StringBuilder stringBuilder = new StringBuilder("");,您会发现开销减少了,因为StringBuilder会将内部缓冲区预分配给256元素,从而减少需要动态调整缓冲区大小的可能性(缓冲区的大小和内容的大小是构建器自己管理的两种不同状态) -
不能Java编译器优化让它遍历集合并计算结果字符串的总大小以避免在最坏情况下重新分配的成本吗?
-
@DmitriiDemenev 怎么样?
Map的内容是在运行时定义的 -
@DmitriiDemenev 在这种情况下,我会说,不,Javac 不会执行任何额外的优化来预先计算内容的大小
标签: java optimization string-concatenation