gpt4 book ai didi

java - 字符串连接的编译时优化

转载 作者:行者123 更新时间:2023-12-01 16:46:53 31 4
gpt4 key购买 nike

我很好奇,以下代码片段的优化会进行到什么程度。

据我所知,每当StringBuffer的容量扩展时,都会花费一些CPU工作量,因为它的内容需要重新分配。不过,我猜Java编译器优化可以预先计算所需的容量,而不是进行多次重新分配。

问题是:下面的代码片段会被优化吗?

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);
}

最佳答案

在 Java 中,大多数优化是由运行时的即时编译器执行的,因此通常 javac 优化并不重要。

因此,Java 编译器不需要优化字符串连接,尽管只要不涉及循环,所有编译器都倾向于这样做。您可以使用 javap(JDK 附带的 java 反编译器)检查此类编译时优化的程度。

那么,javac 可以优化这个吗?要确定字符串生成器的长度,必须迭代映射两次。由于java没有const引用功能,并且编译器对Map没有特殊处理,因此编译器无法确定这种重写会保留代码的含义。即使可以,也根本不清楚所获得的 yield 是否值得迭代两次的成本。毕竟,现代处理器可以在一条 CPU 指令中复制 4 到 8 个字符。由于内存访问是连续的,因此在增加缓冲区时不会丢失任何缓存。另一方面,第二次迭代映射可能会导致额外的缓存未命中,因为映射条目(以及它们引用的字符串)可能分散在整个主内存中。

无论如何,我不会担心这段代码的效率。即使您的 URL 长度为 1000 个字符,调整缓冲区大小也将花费大约 0.1 微秒。除非您有证据表明这确实是性能热点,否则您的时间可能最好花在其他地方。

关于java - 字符串连接的编译时优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48716576/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com