gpt4 book ai didi

java 。连接字符串。微基准

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:59 25 4
gpt4 key购买 nike

第一步我运行这段代码:

public class Demo  {
public static void main(String[] args) {
String x = "x";
long start = System.currentTimeMillis();

for (int i = 0; i < 100000; i++)

{

x = x.concat("s");

// x+="k";

}

System.out.println(System.currentTimeMillis() - start);
}

}

输出:13579。

在第二步我运行这段代码:

public class Demo {
public static void main(String[] args) {
String x = "x";
long start = System.currentTimeMillis();

for (int i = 0; i < 100000; i++)

{

//x = x.concat("s");

x+="k";

}

System.out.println(System.currentTimeMillis() - start);
}

}

输出:27328。

我有两个问题:

  1. 我可以说我的基准 - 正确吗?
  2. 为什么 (+) 和 concat() 之间的时间线差异如此之大??? 13.5 秒 VS 27 秒。为什么?

最佳答案

我认为您的微基准测试很好,我可以重现您的结果。

在我的 JVM 上,x += "k" 慢两倍的原因是它在幕后执行以下操作:

  1. 创建一个新的StringBuilder
  2. x附加到StringBuilder
  3. “k”附加到StringBuilder
  4. 调用 StringBuilder.toString() 并将结果赋值给 x

这会将字符数据复制两次(一次在第 2 步,一次在第 4 步)。

另一方面,x = x.concat("s") 只复制一次数据。

这种双重复制使 x += "k" 比另一个版本慢两倍。

如果你很好奇,下面是我的编译器为 += 循环生成的字节码:

   10:  goto    36
13: new #24; //class java/lang/StringBuilder
16: dup
17: aload_1
18: invokestatic #26; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
21: invokespecial #32; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
24: ldc #35; //String k
26: invokevirtual #37; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
29: invokevirtual #41; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
32: astore_1
33: iinc 4, 1
36: iload 4
38: ldc #45; //int 100000
40: if_icmplt 13

说明 21 和 29 是制作两份副本的地方。

关于 java 。连接字符串。微基准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868645/

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