After running benchmarks for 3.1 vs 5.0 using "Ubuntu arm64 Qualcomm Machines" owned by the JIT Team, I've found few regressions related to Utf8Encoding. They are alll reproducible and I've verified that it's not a matter of loop alignment (by running them with --envVars COMPlus_JitAlignLoops:1).
It looks like it's ARM64 specific regression, I was not able to reproduce it for ARM (the 32 bit variant).
Repro
git clone https://github.com/dotnet/performance.git
python3 ./performance/scripts/benchmarks_ci.py -f netcoreapp3.1 netcoreapp5.0 --architecture arm64 --filter Perf_Utf8Encoding
BenchmarkDotNet=v0.12.1.1405-nightly, OS=ubuntu 16.04
Unknown processor
[Host] : .NET Core 3.1.8 (CoreCLR 4.700.20.41105, CoreFX 4.700.20.41903), Arm64 RyuJIT
Job-VTSQOV : .NET Core 3.1.8 (CoreCLR 4.700.20.41105, CoreFX 4.700.20.41903), Arm64 RyuJIT
Job-RAMSQZ : .NET Core 5.0.0 (CoreCLR 5.0.20.41714, CoreFX 5.0.20.41714), Arm64 RyuJIT
| Method |
Runtime |
Input |
Mean |
Ratio |
Allocated |
| GetByteCount |
.NET Core 3.1 |
EnglishAllAscii |
38.00 us |
1.00 |
- |
| GetByteCount |
.NET Core 5.0 |
EnglishAllAscii |
40.66 us |
1.07 |
- |
|
|
|
|
|
|
| GetBytes |
.NET Core 3.1 |
EnglishAllAscii |
101.09 us |
1.00 |
163840 B |
| GetBytes |
.NET Core 5.0 |
EnglishAllAscii |
104.96 us |
1.04 |
163855 B |
|
|
|
|
|
|
| GetString |
.NET Core 3.1 |
EnglishAllAscii |
103.47 us |
1.00 |
327648 B |
| GetString |
.NET Core 5.0 |
EnglishAllAscii |
95.76 us |
0.93 |
327677 B |
|
|
|
|
|
|
| GetByteCount |
.NET Core 3.1 |
EnglishMostlyAscii |
117.50 us |
1.00 |
- |
| GetByteCount |
.NET Core 5.0 |
EnglishMostlyAscii |
221.40 us |
1.88 |
- |
|
|
|
|
|
|
| GetBytes |
.NET Core 3.1 |
EnglishMostlyAscii |
273.49 us |
1.00 |
169880 B |
| GetBytes |
.NET Core 5.0 |
EnglishMostlyAscii |
377.67 us |
1.38 |
169895 B |
|
|
|
|
|
|
| GetString |
.NET Core 3.1 |
EnglishMostlyAscii |
262.55 us |
1.00 |
327656 B |
| GetString |
.NET Core 5.0 |
EnglishMostlyAscii |
250.18 us |
0.95 |
327685 B |
|
|
|
|
|
|
| GetByteCount |
.NET Core 3.1 |
Chinese |
53.34 us |
1.00 |
- |
| GetByteCount |
.NET Core 5.0 |
Chinese |
90.21 us |
1.69 |
- |
|
|
|
|
|
|
| GetBytes |
.NET Core 3.1 |
Chinese |
245.94 us |
1.00 |
177752 B |
| GetBytes |
.NET Core 5.0 |
Chinese |
279.62 us |
1.14 |
177768 B |
|
|
|
|
|
|
| GetString |
.NET Core 3.1 |
Chinese |
373.80 us |
1.00 |
150112 B |
| GetString |
.NET Core 5.0 |
Chinese |
358.11 us |
0.96 |
150126 B |
|
|
|
|
|
|
| GetByteCount |
.NET Core 3.1 |
Cyrillic |
45.35 us |
1.00 |
- |
| GetByteCount |
.NET Core 5.0 |
Cyrillic |
76.01 us |
1.68 |
- |
|
|
|
|
|
|
| GetBytes |
.NET Core 3.1 |
Cyrillic |
193.34 us |
1.00 |
100880 B |
| GetBytes |
.NET Core 5.0 |
Cyrillic |
222.10 us |
1.15 |
100889 B |
|
|
|
|
|
|
| GetString |
.NET Core 3.1 |
Cyrillic |
262.69 us |
1.00 |
130856 B |
| GetString |
.NET Core 5.0 |
Cyrillic |
259.83 us |
0.99 |
130868 B |
|
|
|
|
|
|
| GetByteCount |
.NET Core 3.1 |
Greek |
58.36 us |
1.00 |
- |
| GetByteCount |
.NET Core 5.0 |
Greek |
97.41 us |
1.67 |
- |
|
|
|
|
|
|
| GetBytes |
.NET Core 3.1 |
Greek |
275.88 us |
1.00 |
129248 B |
| GetBytes |
.NET Core 5.0 |
Greek |
314.00 us |
1.14 |
129260 B |
|
|
|
|
|
|
| GetString |
.NET Core 3.1 |
Greek |
394.55 us |
1.00 |
164264 B |
| GetString |
.NET Core 5.0 |
Greek |
394.35 us |
1.00 |
164278 B |
Docs
Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository
cc @kunalspathak @carlossanlop @pgovind @tannergooding
After running benchmarks for 3.1 vs 5.0 using "Ubuntu arm64 Qualcomm Machines" owned by the JIT Team, I've found few regressions related to
Utf8Encoding. They are alll reproducible and I've verified that it's not a matter of loop alignment (by running them with--envVars COMPlus_JitAlignLoops:1).It looks like it's ARM64 specific regression, I was not able to reproduce it for ARM (the 32 bit variant).
Repro
BenchmarkDotNet=v0.12.1.1405-nightly, OS=ubuntu 16.04
Unknown processor
[Host] : .NET Core 3.1.8 (CoreCLR 4.700.20.41105, CoreFX 4.700.20.41903), Arm64 RyuJIT
Job-VTSQOV : .NET Core 3.1.8 (CoreCLR 4.700.20.41105, CoreFX 4.700.20.41903), Arm64 RyuJIT
Job-RAMSQZ : .NET Core 5.0.0 (CoreCLR 5.0.20.41714, CoreFX 5.0.20.41714), Arm64 RyuJIT
Docs
Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository
cc @kunalspathak @carlossanlop @pgovind @tannergooding