gpt4 book ai didi

Java 8 : String join operation has significant performance impact

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:31 25 4
gpt4 key购买 nike

我正在研究 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 * 单个元素长度的大小)

其他性能指标(内存等)我没有测过。

我的问题是:

  1. 我的测量有什么问题吗(大多数时候我相信 jdk 家伙)
  2. 将“join”API 添加到 String 类的目的是什么
  3. 是否有任何 Java 8 的性能分析可用

最佳答案

要事第一。 这不是你微基准 Java 的方式

阅读How do I write a correct micro-benchmark in Java?第一的。您的号码完全无关紧要,所以让我们忽略它们。

看第二个例子:

abc= "AZY"+"BAX"+"CBA"+...

对我来说,这些看起来像是编译时常量。此 String 将在编译时连接起来,没有任何基准。这是一个无用的比较,因为 StringBuilderString.join 的重点是连接不是编译时常量的 String

继续比较 StringBuilderString.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();
}

这使用了一个 StringJoinerStringJoiner 只是在底层使用了 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/

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