On Wed, 15 Mar 2023 12:28:05 GMT, Eirik Bjorsnos <d...@openjdk.org> wrote:
>>> `if (ch && 0xFFFFFF00 == 0) {` >> >> This seems to perform similar to baseline: >> >> >> Benchmark (codePoint) Mode Cnt Score Error Units >> Characters.isDigit 48 avgt 15 0.890 ± 0.025 ns/op >> Characters.isDigit 1632 avgt 15 2.174 ± 0.011 ns/op >> >> >> Would be interesting to check the performance on non-Intel architectures. If >> you want to give it a spin on your M1, here's the benchmark command I used: >> >> `make test TEST='micro:java.lang.Characters.isDigit' MICRO="OPTIONS=-p >> codePoint=48,1632"` > >> It seems reasonable to keep these two in sync, yes. (`CharacterData.of` >> could even call into `StringLatin1.canEncode`, unless that's cause for some >> performance anomaly) > > If I update `StringLatin1.canEncode` and call into that from > `CharacterData.of`, I observe no regression for the Latin1 case, but a > significant regression for the non-Latin1 case. I have no idea how to explain > that: > > > Benchmark (codePoint) Mode Cnt Score Error Units > Characters.isDigit 48 avgt 15 0.675 ± 0.029 ns/op > Characters.isDigit 1632 avgt 15 2.435 ± 0.032 ns/op Can you check what happen adding much more inputs to the dataset that includes non-latin chars as well and use `-prof perfnorm` to check what `perf` report re branches/branch-misses? You can use SplittableRandom to pre-populate an array of inputs which sequence is "random" but still allow deterministic benchmarking and feed the benchmark method cycling the pre-computed inputs ------------- PR: https://git.openjdk.org/jdk/pull/13040