我正在研究 Java-8 中引入的新添加的现有功能。 新添加到 String 类的一个简单特性对我来说非常有吸引力——那就是 String Join method .
例子:
String.join(" ", "AZY","BAX"); // returns AZY BAX
出于好奇,我通过编写一个简单的java代码检查了这个特性的性能(执行时间)
public static void main(String[] args) {
long start = System.nanoTime();
String abc= String.join(" ,"AZY","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);
}
结果对我来说不是那么令人兴奋(时间以 neno 秒为单位)
Java 8 String Join 1340114
Tranditional 59785
String Builder Append 102807
复杂度为 o(n) - 事实上它是(n * 单个元素长度的大小)
其他性能指标(内存等)我没有测过。
我的问题是:
- 我的测量有什么问题吗(大多数时候我相信 jdk 家伙)
- 将“join”API 添加到 String 类的目的是什么
- 是否有任何 Java 8 的性能分析可用
最佳答案
要事第一。 这不是你微基准 Java 的方式
阅读How do I write a correct micro-benchmark in Java?第一的。您的号码完全无关紧要,所以让我们忽略它们。
看第二个例子:
abc= "AZY"+"BAX"+"CBA"+...
对我来说,这些看起来像是编译时常量。此 String
将在编译时连接起来,没有任何基准。这是一个无用的比较,因为 StringBuilder
或 String.join
的重点是连接不是编译时常量的 String
。
继续比较 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
,将 1000 个 String
加入“”(空格)。而您的 StringBuilder
方法只是将它们附加在一起。这两个是不一样的。
String.join
方法的要点在于您可以:
String.join(", ", "a", "b", "c") // result is "a, b, c"
如果使用 StringBuilder
,您将不得不添加更多代码。
关于Java 8 : String join operation has significant performance impact,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24053499/