Java 8 : String join operation has significant performance impact

标签 java java-8

我正在研究 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/

相关文章:

Java - 如何告诉所有子线程都完成了

java - 无法将字符串解析为 LocalDate (Java 8)

java - eclipse根据构造函数参数生成类变量getter setter

java - 在 USB 主机模式下将数据从 android 发送到连接的 USB 存储设备

java - gridview 重复显示同一张图片

Windows 10 上的 Java 安装程序问题

java - 为什么我们在 Java 8 中有单独的 Spliterators 类?

java - 根据数据更改 ListView 项的文本颜色

Java Recursion : How to avoid the last comma when write 1. .n 在一行中用逗号分隔。查看里面的完整任务描述

java - 在 try-with-resources 中关闭动态数量的 AutoCloseable 对象