Skip to content

Performance Regression: UTF8 Span Methods 3x slower on AMD Platforms (NetCore2.1 -> 3.1) #2251

@jamescourtney

Description

@jamescourtney

Performance of some UTF8 string methods seems to have regressed in a major way on AMD platforms in .NET Core 3.1. Others may be affected as well.

Test:

 [SimpleJob(BenchmarkDotNet.Jobs.RuntimeMoniker.NetCoreApp21)] [SimpleJob(BenchmarkDotNet.Jobs.RuntimeMoniker.NetCoreApp31)] public class Benchmark { const string testString = "hello world"; private static readonly Encoding Utf8NoBom = new UTF8Encoding(false); private readonly byte[] writeBuffer = new byte[1024]; private readonly byte[] readBuffer = Utf8NoBom.GetBytes(testString); [Benchmark] public void WriteString() { Utf8NoBom.GetBytes(testString.AsSpan(), this.writeBuffer.AsSpan()); } [Benchmark] public void ReadString() { Utf8NoBom.GetString(this.readBuffer.AsSpan()); } static void Main(string[] args) { BenchmarkRunner.Run<Benchmark>(); } }

AMD system results:

BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18363 AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores .NET Core SDK=3.1.101 [Host] : .NET Core 3.1.1 (CoreCLR 4.700.19.60701, CoreFX 4.700.19.60801), X64 RyuJIT Job-RNGYVQ : .NET Core 2.1.15 (CoreCLR 4.6.28325.01, CoreFX 4.6.28327.02), X64 RyuJIT Job-ILXJIL : .NET Core 3.1.1 (CoreCLR 4.700.19.60701, CoreFX 4.700.19.60801), X64 RyuJIT | Method | Runtime | Mean | Error | StdDev | |------------ |-------------- |---------:|---------:|---------:| | WriteString | .NET Core 2.1 | 24.68 ns | 0.187 ns | 0.175 ns | | ReadString | .NET Core 2.1 | 23.33 ns | 0.373 ns | 0.349 ns | | WriteString | .NET Core 3.1 | 70.51 ns | 0.787 ns | 0.736 ns | | ReadString | .NET Core 3.1 | 86.46 ns | 0.153 ns | 0.143 ns | 

Intel system results:

BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18363 Intel Xeon CPU E5-1650 v4 3.60GHz, 1 CPU, 12 logical and 6 physical cores .NET Core SDK=3.1.101 [Host] : .NET Core 3.1.1 (CoreCLR 4.700.19.60701, CoreFX 4.700.19.60801), X64 RyuJIT Job-POUEZF : .NET Core 2.1.15 (CoreCLR 4.6.28325.01, CoreFX 4.6.28327.02), X64 RyuJIT Job-JZNDHJ : .NET Core 3.1.1 (CoreCLR 4.700.19.60701, CoreFX 4.700.19.60801), X64 RyuJIT | Method | Runtime | Mean | Error | StdDev | |------------ |-------------- |---------:|---------:|---------:| | WriteString | .NET Core 2.1 | 34.38 ns | 0.709 ns | 1.204 ns | | ReadString | .NET Core 2.1 | 31.24 ns | 0.652 ns | 1.376 ns | | WriteString | .NET Core 3.1 | 13.61 ns | 0.301 ns | 0.519 ns | | ReadString | .NET Core 3.1 | 29.86 ns | 0.623 ns | 1.340 ns | 

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions