相关疑难解决方法(0)

String 构造函数中缺少边界检查消除?

查看 UTF8 解码性能,我注意到 protobuf 的性能UnsafeProcessor::decodeUtf8优于String(byte[] bytes, int offset, int length, Charset charset)以下非 ascii 字符串:"Quizdeltagerne spiste jordb\xc3\xa6r med fl\xc3\x98de, mens cirkusklovnen"

\n

我试图找出原因,所以我复制了相关代码,String并将数组访问替换为不安全的数组访问,与 相同UnsafeProcessor::decodeUtf8。\n以下是 JMH 基准测试结果:

\n
Benchmark                       Mode  Cnt    Score   Error  Units\nStringBenchmark.safeDecoding    avgt   10  127.107 \xc2\xb1 3.642  ns/op\nStringBenchmark.unsafeDecoding  avgt   10  100.915 \xc2\xb1 4.090  ns/op\n
Run Code Online (Sandbox Code Playgroud)\n

我认为差异是由于缺少边界检查消除而导致的,特别是因为checkBoundsOffCount(offset, length, bytes.length)String(byte[] bytes, int offset, int length, Charset charset).

\n

这个问题真的是缺少边界检查消除吗?

\n

这是我使用 OpenJDK 17 和 JMH 进行基准测试的代码。请注意,这只是String(byte[] bytes, …

performance jit jvm-hotspot bounds-check-elimination protobuf-java

11
推荐指数
1
解决办法
445
查看次数