== FoldArrayAccess @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(3) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @CompilerControl(CompilerControl.Mode.DONT_INLINE) public class FoldArrayAccess { static final String TEST_STRING_LATIN1 = "Foo"; static final String TEST_STRING_UTF16 = "Фуу"; private int idx = 0; @Benchmark public char string_latin1_const() { return TEST_STRING_LATIN1.charAt(0); } @Benchmark public char string_utf16_const() { return TEST_STRING_UTF16.charAt(0); } @Benchmark public char string_latin1_field() { return TEST_STRING_LATIN1.charAt(idx); } @Benchmark public char string_utf16_field() { return TEST_STRING_UTF16.charAt(idx); } } === Results Benchmark Mode Cnt Score Error Units # Baseline FoldArrayAccess.string_latin1_const avgt 15 3.520 ± 0.083 ns/op FoldArrayAccess.string_latin1_field avgt 15 3.288 ± 0.030 ns/op FoldArrayAccess.string_utf16_const avgt 15 3.512 ± 0.038 ns/op FoldArrayAccess.string_utf16_field avgt 15 3.308 ± 0.051 ns/op # Patched FoldArrayAccess.string_latin1_const avgt 15 2.882 ± 0.017 ns/op FoldArrayAccess.string_latin1_field avgt 15 3.278 ± 0.014 ns/op FoldArrayAccess.string_utf16_const avgt 15 2.877 ± 0.006 ns/op FoldArrayAccess.string_utf16_field avgt 15 3.301 ± 0.140 ns/op === Generated Code (C2) [Const cases] Baseline (latin1): [Verified Entry Point] 7.17% 0.46% 0x00007f777d95e000: sub $0x18,%rsp 0.11% 0.09% 0x00007f777d95e007: mov %rbp,0x10(%rsp) 0.04% 0.05% 0x00007f777d95e00c: movabs $0x5e92f3e28,%r10 ; {oop([B)} 6.56% 8.16% 0x00007f777d95e016: movzbl 0x10(%r10),%eax ; <--- array access 0x00007f777d95e01b: add $0x10,%rsp 0.09% 0.12% 0x00007f777d95e01f: pop %rbp 26.67% 38.37% 0x00007f777d95e020: test %eax,0x105ddfda(%rip) 0.04% 0x00007f777d95e026: retq Baseline (utf16): [Verified Entry Point] 7.02% 0.35% 0x00007f1bf195e200: sub $0x18,%rsp 0.07% 0.04% 0x00007f1bf195e207: mov %rbp,0x10(%rsp) 0.04% 0.02% 0x00007f1bf195e20c: movabs $0x5e92f3db8,%r10 ; {oop([B)} 7.25% 8.36% 0x00007f1bf195e216: movzwl 0x10(%r10),%eax ; <--- array access 0.02% 0x00007f1bf195e21b: add $0x10,%rsp 0.04% 0.05% 0x00007f1bf195e21f: pop %rbp 26.33% 39.03% 0x00007f1bf195e220: test %eax,0xee6cdda(%rip) 0.02% 0x00007f1bf195e226: retq Patched (latin1): [Verified Entry Point] 6.88% 7.26% 0x00007fbe7995cf00: sub $0x18,%rsp 2.17% 2.40% 0x00007fbe7995cf07: mov %rbp,0x10(%rsp) 0x00007fbe7995cf0c: mov $0x46,%eax ; <--- folded 6.29% 6.01% 0x00007fbe7995cf11: add $0x10,%rsp 0x00007fbe7995cf15: pop %rbp 17.05% 22.36% 0x00007fbe7995cf16: test %eax,0xe4ab0e4(%rip) 0x00007fbe7995cf1c: retq Patched (utf16): [Verified Entry Point] 5.75% 7.06% 0x00007ffaed1d2180: sub $0x18,%rsp 1.91% 2.54% 0x00007ffaed1d2187: mov %rbp,0x10(%rsp) 0x00007ffaed1d218c: mov $0x424,%eax ; <--- folded 6.92% 5.87% 0x00007ffaed1d2191: add $0x10,%rsp 0x00007ffaed1d2195: pop %rbp 17.63% 22.79% 0x00007ffaed1d2196: test %eax,0x12496e64(%rip) 0x00007ffaed1d219c: retq == FoldArrayLength @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(3) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @CompilerControl(CompilerControl.Mode.DONT_INLINE) public class FoldArrayLength { static final String TEST_STRING_LATIN1 = "Foo"; static final String TEST_STRING_UTF16 = "Фуу"; @Benchmark public int string_length_latin1() { return TEST_STRING_LATIN1.length(); } @Benchmark public int string_length_utf16() { return TEST_STRING_UTF16.length(); } } Benchmark Mode Cnt Score Error Units # Baseline FoldArrayLength.string_length_latin1 avgt 15 2.885 ± 0.017 ns/op FoldArrayLength.string_length_utf16 avgt 15 2.882 ± 0.008 ns/op # Patched FoldArrayLength.string_length_latin1 avgt 15 2.880 ± 0.011 ns/op FoldArrayLength.string_length_utf16 avgt 15 2.896 ± 0.034 ns/op