当前位置: 首页 > 面试题库 >

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

狄雅珺
2023-03-14
问题内容

我正在研究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(" ,"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);

}

结果对我来说并不那么令人兴奋(以秒为单位的时间)

Java 8 String Join     1340114
Tranditional             59785
String Builder Append   102807

复杂度为o(n)–实际上为(n *单个元素长度的大小)

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

我的问题是:

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

问题答案:

首先是第一件事。 这不是您的微平台Java方式

阅读如何在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您将不得不添加更多代码。



 类似资料:
  • 问题内容: 网上有很多关于python性能的文章,这是您首先读到的:不应使用’+’连接字符串:避免使用s1 + s2 + s3,而应使用str.join 我尝试了以下操作:将两个字符串连接为目录路径的一部分:三种方法: 我不应该做的“ +” 连接 os.path.join 这是我的代码: 这里的结果(python 2.5 WinXP) 难道不是正好相反吗? 问题答案: 的确,您不应使用“ +”。您

  • 问题内容: 我经常听到人们说这是最好的做法之一,在记录时避免使用它。 我正在查看代码,以了解他们如何处理此问题,并认为他们正在做类似的事情。 这是方法的代码片段,它采用模式和参数并返回要记录的消息。 我不明白这种实现比使用串联更好。任何对此的见解将非常有帮助。 问题答案: 日志系统中格式字符串的好处是,日志系统可以决定是否必须进行字符串连接。 让我们以这些行为例: 只要此记录器的级别为debug或

  • Space是一个字符串连接运算符,它合并两个字符串。 以下示例演示了这一点 - 例子 (Example) [jerry]$ awk 'BEGIN { str1 = "Hello, "; str2 = "World"; str3 = str1 str2; print str3 }' 输出 (Output) 执行此代码时,您将获得以下结果 - Hello, World

  • 本文向大家介绍MySql删除和更新操作对性能有影响吗,包括了MySql删除和更新操作对性能有影响吗的使用技巧和注意事项,需要的朋友参考一下 删除和更新操作的开销往往比插入高,所以一个好的设计需要减少对数据库的更新和删除操作。 3.1更新操作 数据库的更新操作会带来一连串的“效应”:更新操作需要记录日志(以便错误时回滚);更新可变长字段(如,varchar类型)会带来数据物理存储的变化(记录的移动)

  • 我试图评估比较两个字符串是否会随着它们的长度增加而变慢。我的计算表明比较字符串应该需要一个摊销常数时间,但我的Python实验产生了奇怪的结果: 下面是字符串长度(1到400)与时间(毫秒)的关系图。自动垃圾收集已禁用,并且gc。在每次迭代之间运行collect。 我每次比较100万随机字符串,计算匹配如下。这个过程重复50次,然后取所有测量时间的最小值。 什么可能解释长度64左右突然增加? 注意

  • 前言 忙活了一个礼拜,终于等到周末,可以空下来写点东西。 之前已经完成《数值运算》和《布尔运算》,这次轮到介绍字符串操作 。咱们先得弄明白两个内容: 什么是字符串? 对字符串有哪些操作? 下面是"在线新华字典"的解释: 字符串:简称“串”。有限字符的序列。数据元素为字符的线性表,是一种数据的逻辑结构。在计算机中可有不同的存储结构。在串上可进行求子串、插入字符、删除字符、置换字符等运算。 而字符呢?