gpt4 book ai didi

java - 为什么将整数转换为字符串时,字符串连接比 String.valueOf 更快?

转载 作者:太空狗 更新时间:2023-10-29 22:35:10 25 4
gpt4 key购买 nike

我有一个基准:

@BenchmarkMode(Mode.Throughput)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS, batchSize = 1000)
@Measurement(iterations = 40, time = 1, timeUnit = TimeUnit.SECONDS, batchSize = 1000)
public class StringConcatTest {

private int aInt;

@Setup
public void prepare() {
aInt = 100;
}

@Benchmark
public String emptyStringInt() {
return "" + aInt;
}

@Benchmark
public String valueOfInt() {
return String.valueOf(aInt);
}

}

结果如下:

Benchmark                                          Mode  Cnt      Score      Error  Units
StringConcatTest.emptyStringInt thrpt 40 66045.741 ± 1306.280 ops/s
StringConcatTest.valueOfInt thrpt 40 43947.708 ± 1140.078 ops/s

它表明空字符串与整数的连接比调用 String.value(100) 快 30%。我明白 ""+ 100 转换为

new StringBuilder().append(100).toString()

-XX:+OptimizeStringConcat 优化应用,使其速度更快。我不明白的是为什么 valueOf 本身比连接慢。有人可以解释到底发生了什么以及为什么 ""+ 100 更快。 OptimizeStringConcat 有什么魔力?

最佳答案

正如您所提到的,HotSpot JVM 具有 -XX:+OptimizeStringConcat 优化,可识别 StringBuilder 模式并将其替换为高度调整的手写 IR 图,而 String.valueOf() 依赖于一般的编译器优化。

通过分析生成的汇编代码,我发现了以下主要区别:

  • 优化的 concat 不会将为结果字符串创建的 char[] 数组置零,而由 Integer.toString 创建的数组在分配后会像任何其他常规对象一样被清除.
  • 优化的 concat 通过简单的 addition of '0' constant 将数字转换为字符,而 Integer.getChars 使用 table lookup 和相关的数组边界检查等。

PhaseStringOpts::int_getCharsInteger.getChars 的实现中还有其他细微差别,但我想它们对性能影响不大。


顺便说一句,如果您取一个更大的数字(例如 1234567890),性能差异将可以忽略不计,因为 Integer.getChars 中的 extra loop 会一次转换两位数字。

关于java - 为什么将整数转换为字符串时,字符串连接比 String.valueOf 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42193955/

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