首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在将整数转换为字符串时,字符串连接比String.valueOf更快?

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

Stack Overflow用户
提问于 2017-02-13 06:17:04
回答 1查看 1.4K关注 0票数 21

我有一个基准:

代码语言:javascript
复制
@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);
    }

}

下面是结果:

代码语言:javascript
复制
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转换为

代码语言:javascript
复制
new StringBuilder().append(100).toString()

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-13 09:02:04

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

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

与任何其他常规object.

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

PhaseStringOpts::int_getCharsInteger.getChars的实现中还有其他一些细微的差异,但我猜它们对性能并不是很重要。

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42193955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档