如何解决Java 8:字符串连接操作对性能有重大影响
首先是第一件事。
阅读如何在Java中编写正确的微基准测试?第一。您的电话号码完全无关紧要,因此请忽略它们。
看第二个例子:
abc= "AZY"+"BAX"+"CBA"+...
在我看来,这些看起来像编译时间常数。这String
将在编译时连接起来,并且没有基准可言。这是无用的比较,因为StringBuilder
or
的全部要点String.join
是将String
不是编译时间常数的s 连接在一起。
继续比较StringBuilder
和String.join
。查看源代码:
public static String join(CharSequence delimiter, CharSequence... elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
// Number of elements not likely worth Arrays.stream overhead.
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}
这使用StringJoiner
。一个StringJoiner
简单地使用StringBuilder
引擎盖下,所以两者是等效的。
通常看 代码 比尝试对性能进行基准测试要有用得多。即使您正确进行基准测试。
还值得注意的是,您的第一种方法使用join
,String
在“”(空格)上加入了1000
s。而您的StringBuilder
方法只是将它们附加在一起。这两个不一样。
该String.join
方法的重点是您可以执行以下操作:
String.join(", ", "a", "b", "c") // result is "a, b, c"
解决方法
我正在研究Java-8中引入的新添加的现有功能。新添加到String类的一个简单功能对我来说很有吸引力-即String
Join方法。
例:
String.join(" ","AZY","BAX"); // returns AZY BAX
出于好奇,我已经通过编写简单的Java代码检查了此功能的性能(执行时间)
public static void main(String[] args) {
long start = System.nanoTime();
String abc= String.join(","BAX" … // joining 1000 words of size 3 char;
long diff = System.nanoTime() - start;
System.out.println(" Java 8 String Join " + diff);
start = System.nanoTime();
abc= "AZY"+"BAX"+"CBA"+ … // adding 1000 word of size 3 char;
diff = System.nanoTime() - start;
System.out.println(" Tranditional " + diff);
start = System.nanoTime();
new StringBuilder().append("AZY").append("BAX").appe… // appending 1000 word of size 3 char;
diff = System.nanoTime() - start;
System.out.println(" String Builder Append " + diff);
}
结果对我来说并不那么令人兴奋(以秒为单位的时间)
Java 8 String Join 1340114
Tranditional 59785
String Builder Append 102807
复杂度为o(n)–实际上为(n *单个元素长度的大小)
我没有测量过的其他性能指标(内存等)。
我的问题是:
- 我的测量有什么问题吗(大多数时候我相信jdk的人)
- 向String类添加“ join” API的目的是什么
- Java 8是否有任何性能分析可用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。