查看 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"。
我试图找出原因,所以我复制了相关代码,String并将数组访问替换为不安全的数组访问,与 相同UnsafeProcessor::decodeUtf8。\n以下是 JMH 基准测试结果:
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\nRun Code Online (Sandbox Code Playgroud)\n我认为差异是由于缺少边界检查消除而导致的,特别是因为checkBoundsOffCount(offset, length, bytes.length)在String(byte[] bytes, int offset, int length, Charset charset).
这个问题真的是缺少边界检查消除吗?
\n这是我使用 OpenJDK 17 和 JMH 进行基准测试的代码。请注意,这只是String(byte[] bytes, …
performance jit jvm-hotspot bounds-check-elimination protobuf-java