微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java 8:字符串连接操作对性能有重大影响

如何解决Java 8:字符串连接操作对性能有重大影响

首先是第一件事。

阅读如何在Java中编写正确的微基准测试?第一。您的电话号码完全无关紧要,因此请忽略它们。

看第二个例子:

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

在我看来,这些看起来像编译时间常数。这String将在编译时连接起来,并且没有基准可言。这是无用的比较,因为StringBuilderor 的全部要点String.join是将String不是编译时间常数的s 连接在一起。

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

这使用StringJoiner一个StringJoiner简单地使用StringBuilder引擎盖下,所以两者是等效的。

通常看 代码 比尝试对性能进行基准测试要有用得多。即使您正确进行基准测试。

还值得注意的是,您的第一种方法使用joinString在“”(空格)上加入了1000 s。而您的StringBuilder方法只是将它们附加在一起。这两个不一样。

String.join方法的重点是您可以执行以下操作:

String.join(", ", "a", "b", "c") // result is "a, b, c"

使用a,StringBuilder您将不得不添加更多代码

解决方法

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

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

我的问题是:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。