镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Benchmarks for dotnet/runtime#126700 (for @EgorBo) #112

Open

Description

@EgorBot

Processing benchmark request from PR dotnet/runtime#126700.

Targets: ubuntu24_azure_cobalt100, macos15_helix_arm64, ubuntu24_aws_graviton4
Commits: main;PR_126700

Results will be posted here once they are ready.

Activity

  1. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for macos15_helix_arm64

    @EgorBo

    BenchmarkDotNet v0.15.8, macOS Sequoia 15.4.1 (24E263) [Darwin 24.4.0]
    Apple M4, 1 CPU, 10 logical and 10 physical cores
    .NET SDK 11.0.100-preview.4.26208.110
      [Host]     : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
    
    Method Toolchain Mean Error Ratio Allocated Alloc Ratio
    TokenSerialization PR #126700 47.72 μs 0.459 μs 1.00 - NA
    TokenSerialization main 50.34 μs 0.078 μs 1.06 - NA
    BDN profiler traces (speedscope)

    Full logs

  2. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for ubuntu24_aws_graviton4

    @EgorBo

    BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04 LTS (Noble Numbat)
    Neoverse-V2, 8 physical cores
    .NET SDK 11.0.100-preview.4.26208.110
      [Host]     : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
    
    Method Toolchain Mean Error Ratio Allocated Alloc Ratio
    TokenSerialization PR #126700 90.23 μs 0.054 μs 1.00 - NA
    TokenSerialization main 101.76 μs 0.038 μs 1.13 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126700
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    Full logs

  3. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for ubuntu24_azure_cobalt100

    @EgorBo

    BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
    Neoverse-N2, 8 physical cores
    .NET SDK 11.0.100-preview.4.26208.110
      [Host]     : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
    
    Method Toolchain Mean Error Ratio Allocated Alloc Ratio
    TokenSerialization PR #126700 90.40 μs 0.070 μs 1.00 - NA
    TokenSerialization main 99.56 μs 0.029 μs 1.10 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126700
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    Full logs

  4. EgorBo commented on Apr 9, 2026

    @EgorBo

    @EgorBot -linux_azure_arm -linux_aws_arm -profiler

    using System.Text;
    using System.Text.Json;
    using BenchmarkDotNet.Attributes;
    using BenchmarkDotNet.Running;
    
    BenchmarkSwitcher.FromAssembly(typeof(Benchmarks).Assembly).Run(args);
    
    [MemoryDiagnoser]
    public class Benchmarks
    {
        // ── TokenSerialization fields ────────────────────────────────────────────
        private List<object> _tokenObjects;
        [ThreadStatic] static Utf8JsonWriter t_writer;
        [ThreadStatic] static MemoryStream t_stream;
    
        [GlobalSetup]
        public void Setup()
        {
            // TokenSerialization
            _tokenObjects = new List<object>(200);
            for (int i = 0; i < 200; i++)
            {
                if (i % 3 == 0)
                    _tokenObjects.Add(GenerateRecordJson(1));
                else
                    _tokenObjects.Add(new Dictionary<string, object>
                    {
                        ["seq"] = i,
                        ["label"] = $"item_{i}",
                        ["blob"] = new byte[100]
                    });
            }
        }
    
        private static string GenerateRecordJson(int targetSizeKb = 150)
        {
            var sb = new StringBuilder(targetSizeKb * 1024 + 512);
            sb.Append("{");
            sb.Append("\"TypeName\":\"product\",");
            sb.Append("\"CategoryCode\":1,");
            sb.Append("\"Label\":\"Product\",");
            sb.Append("\"IsAction\":false,");
            sb.Append("\"IsActionMember\":false,");
            sb.Append("\"IsTrackingEnabled\":true,");
            sb.Append("\"IsAvailableLocal\":true,");
            sb.Append("\"IsChildRecord\":false,");
            sb.Append("\"IsLinksEnabled\":true,");
            sb.Append("\"IsCustomRecord\":false,");
            sb.Append("\"PrimaryKeyField\":\"productid\",");
            sb.Append("\"PrimaryLabelField\":\"title\",");
            sb.Append("\"Fields\":[");
            int targetBytes = targetSizeKb * 1024;
            int fieldIndex = 0;
            bool firstField = true;
            while (sb.Length < targetBytes - 512)
            {
                if (!firstField) sb.Append(",");
                firstField = false;
                sb.Append("{");
                sb.Append($"\"TypeName\":\"field_{fieldIndex}\",");
                sb.Append($"\"InternalName\":\"Field_{fieldIndex}\",");
                sb.Append($"\"FieldType\":\"String\",");
                sb.Append($"\"Label\":\"Field {fieldIndex}\",");
                sb.Append($"\"MaxSize\":100,");
                sb.Append($"\"IsReadable\":true,");
                sb.Append($"\"IsCreatable\":true,");
                sb.Append($"\"IsUpdatable\":true,");
                sb.Append($"\"IsTrackingEnabled\":false,");
                sb.Append($"\"IsPrimaryKey\":false,");
                sb.Append($"\"IsVirtual\":false,");
                sb.Append($"\"Requirement\":\"None\"");
                sb.Append("}");
                fieldIndex++;
            }
            sb.Append("]");
            sb.Append("}");
            return sb.ToString();
        }
    
        [Benchmark]
        public void TokenSerialization()
        {
            var stream = t_stream ??= new MemoryStream(64 * 1024);
            stream.Position = 0;
            stream.SetLength(0);
            var writer = t_writer;
            if (writer == null)
            {
                writer = new Utf8JsonWriter(stream, new JsonWriterOptions { SkipValidation = true });
                t_writer = writer;
            }
            else
                writer.Reset(stream);
            writer.WriteStartObject();
            writer.WriteStartArray("Catalog");
            foreach (var token in _tokenObjects)
            {
                if (token is string strToken)
                {
                    if (!string.IsNullOrEmpty(strToken))
                        writer.WriteRawValue(strToken);
                }
                else if (token is Dictionary<string, object> dictToken)
                {
                    writer.WriteStartObject();
                    foreach (var kvp in dictToken)
                    {
                        writer.WritePropertyName(kvp.Key);
                        JsonSerializer.Serialize(writer, kvp.Value);
                    }
                    writer.WriteEndObject();
                }
            }
            writer.WriteEndArray();
            writer.WriteEndObject();
            writer.Flush();
            if (stream.Length == 0) throw new Exception("unreachable");
        }
    }
  5. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Benchmark job submitted. The results will be posted here once they are ready.

  6. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for ubuntu24_aws_graviton4

    @EgorBo

    BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04 LTS (Noble Numbat)
    Neoverse-V2, 8 physical cores
    .NET SDK 11.0.100-preview.4.26208.110
      [Host]     : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
    
    Method Toolchain Mean Error Ratio Allocated Alloc Ratio
    TokenSerialization PR #126700 90.13 μs 0.100 μs 1.00 - NA
    TokenSerialization main 105.15 μs 0.034 μs 1.17 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126700
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    Full logs

  7. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for ubuntu24_azure_cobalt100

    @EgorBo

    BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
    Neoverse-N2, 8 physical cores
    .NET SDK 11.0.100-preview.4.26208.110
      [Host]     : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
    
    Method Toolchain Mean Error Ratio Allocated Alloc Ratio
    TokenSerialization PR #126700 92.12 μs 0.038 μs 1.00 - NA
    TokenSerialization main 99.27 μs 0.039 μs 1.08 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126700
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    Full logs

  8. EgorBo commented on Apr 9, 2026

    @EgorBo

    @EgorBot -linux_azure_arm -aws_amd -arm -linux_aws_arm -profiler

    using System.Text;
    using System.Text.Json;
    using BenchmarkDotNet.Attributes;
    using BenchmarkDotNet.Running;
    
    BenchmarkSwitcher.FromAssembly(typeof(Benchmarks).Assembly).Run(args);
    
    [MemoryDiagnoser]
    public class Benchmarks
    {
        // ── TokenSerialization fields ────────────────────────────────────────────
        private List<object> _tokenObjects;
        [ThreadStatic] static Utf8JsonWriter t_writer;
        [ThreadStatic] static MemoryStream t_stream;
    
        [GlobalSetup]
        public void Setup()
        {
            // TokenSerialization
            _tokenObjects = new List<object>(200);
            for (int i = 0; i < 200; i++)
            {
                if (i % 3 == 0)
                    _tokenObjects.Add(GenerateRecordJson(1));
                else
                    _tokenObjects.Add(new Dictionary<string, object>
                    {
                        ["seq"] = i,
                        ["label"] = $"item_{i}",
                        ["blob"] = new byte[100]
                    });
            }
        }
    
        private static string GenerateRecordJson(int targetSizeKb = 150)
        {
            var sb = new StringBuilder(targetSizeKb * 1024 + 512);
            sb.Append("{");
            sb.Append("\"TypeName\":\"product\",");
            sb.Append("\"CategoryCode\":1,");
            sb.Append("\"Label\":\"Product\",");
            sb.Append("\"IsAction\":false,");
            sb.Append("\"IsActionMember\":false,");
            sb.Append("\"IsTrackingEnabled\":true,");
            sb.Append("\"IsAvailableLocal\":true,");
            sb.Append("\"IsChildRecord\":false,");
            sb.Append("\"IsLinksEnabled\":true,");
            sb.Append("\"IsCustomRecord\":false,");
            sb.Append("\"PrimaryKeyField\":\"productid\",");
            sb.Append("\"PrimaryLabelField\":\"title\",");
            sb.Append("\"Fields\":[");
            int targetBytes = targetSizeKb * 1024;
            int fieldIndex = 0;
            bool firstField = true;
            while (sb.Length < targetBytes - 512)
            {
                if (!firstField) sb.Append(",");
                firstField = false;
                sb.Append("{");
                sb.Append($"\"TypeName\":\"field_{fieldIndex}\",");
                sb.Append($"\"InternalName\":\"Field_{fieldIndex}\",");
                sb.Append($"\"FieldType\":\"String\",");
                sb.Append($"\"Label\":\"Field {fieldIndex}\",");
                sb.Append($"\"MaxSize\":100,");
                sb.Append($"\"IsReadable\":true,");
                sb.Append($"\"IsCreatable\":true,");
                sb.Append($"\"IsUpdatable\":true,");
                sb.Append($"\"IsTrackingEnabled\":false,");
                sb.Append($"\"IsPrimaryKey\":false,");
                sb.Append($"\"IsVirtual\":false,");
                sb.Append($"\"Requirement\":\"None\"");
                sb.Append("}");
                fieldIndex++;
            }
            sb.Append("]");
            sb.Append("}");
            return sb.ToString();
        }
    
        [Benchmark]
        public void TokenSerialization()
        {
            var stream = t_stream ??= new MemoryStream(64 * 1024);
            stream.Position = 0;
            stream.SetLength(0);
            var writer = t_writer;
            if (writer == null)
            {
                writer = new Utf8JsonWriter(stream, new JsonWriterOptions { SkipValidation = true });
                t_writer = writer;
            }
            else
                writer.Reset(stream);
            writer.WriteStartObject();
            writer.WriteStartArray("Catalog");
            foreach (var token in _tokenObjects)
            {
                if (token is string strToken)
                {
                    if (!string.IsNullOrEmpty(strToken))
                        writer.WriteRawValue(strToken);
                }
                else if (token is Dictionary<string, object> dictToken)
                {
                    writer.WriteStartObject();
                    foreach (var kvp in dictToken)
                    {
                        writer.WritePropertyName(kvp.Key);
                        JsonSerializer.Serialize(writer, kvp.Value);
                    }
                    writer.WriteEndObject();
                }
            }
            writer.WriteEndArray();
            writer.WriteEndObject();
            writer.Flush();
            if (stream.Length == 0) throw new Exception("unreachable");
        }
    }
  9. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Benchmark job submitted. The results will be posted here once they are ready.

  10. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for macos15_helix_arm64

    @EgorBo

    BenchmarkDotNet v0.15.8, macOS Sequoia 15.3.1 (24D70) [Darwin 24.3.0]
    Apple M2, 1 CPU, 8 logical and 8 physical cores
    .NET SDK 11.0.100-preview.4.26208.110
      [Host]     : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
    
    Method Toolchain Mean Error Ratio Allocated Alloc Ratio
    TokenSerialization PR #126700 58.08 μs 0.298 μs 1.00 - NA
    TokenSerialization main 65.60 μs 0.498 μs 1.13 - NA
    BDN profiler traces (speedscope)

    Full logs

  11. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for ubuntu24_aws_genoa

    @EgorBo

    BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.3 LTS (Noble Numbat)
    AMD EPYC 9R14 2.60GHz, 1 CPU, 8 logical and 8 physical cores
    .NET SDK 11.0.100-preview.4.26208.110
      [Host]     : .NET 10.0.5 (10.0.5, 10.0.526.15411), X64 RyuJIT x86-64-v4
    
    Method Toolchain Mean Error Ratio Allocated Alloc Ratio
    TokenSerialization PR #126700 65.38 μs 0.018 μs 1.00 - NA
    TokenSerialization main 63.23 μs 0.079 μs 0.97 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126700
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    Full logs

  12. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for ubuntu24_aws_graviton4

    @EgorBo

    BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04 LTS (Noble Numbat)
    Neoverse-V2, 8 physical cores
    .NET SDK 11.0.100-preview.4.26208.110
      [Host]     : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
    
    Method Toolchain Mean Error Ratio Allocated Alloc Ratio
    TokenSerialization PR #126700 92.20 μs 0.033 μs 1.00 - NA
    TokenSerialization main 102.89 μs 0.030 μs 1.12 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126700
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    Full logs

  13. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for ubuntu24_azure_cobalt100

    @EgorBo

    BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
    Neoverse-N2, 8 physical cores
    .NET SDK 11.0.100-preview.4.26208.110
      [Host]     : .NET 10.0.5 (10.0.5, 10.0.526.15411), Arm64 RyuJIT armv8.0-a
    
    Method Toolchain Mean Error Ratio Allocated Alloc Ratio
    TokenSerialization PR #126700 93.98 μs 0.037 μs 1.00 - NA
    TokenSerialization main 98.50 μs 0.048 μs 1.05 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126700
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    Full logs

  14. EgorBo commented on Apr 9, 2026

    @EgorBo

    @EgorBot -linux_azure_arm -aws_amd -arm -linux_aws_arm

    using System.Text;
    using System.Text.Json;
    using BenchmarkDotNet.Attributes;
    using BenchmarkDotNet.Running;
    
    BenchmarkSwitcher.FromAssembly(typeof(Benchmarks).Assembly).Run(args);
    
    [MemoryDiagnoser]
    public class Benchmarks
    {
        // ── TokenSerialization fields ────────────────────────────────────────────
        private List<object> _tokenObjects;
        [ThreadStatic] static Utf8JsonWriter t_writer;
        [ThreadStatic] static MemoryStream t_stream;
    
        [GlobalSetup]
        public void Setup()
        {
            // TokenSerialization
            _tokenObjects = new List<object>(200);
            for (int i = 0; i < 200; i++)
            {
                if (i % 3 == 0)
                    _tokenObjects.Add(GenerateRecordJson(1));
                else
                    _tokenObjects.Add(new Dictionary<string, object>
                    {
                        ["seq"] = i,
                        ["label"] = $"item_{i}",
                        ["blob"] = new byte[100]
                    });
            }
        }
    
        private static string GenerateRecordJson(int targetSizeKb = 150)
        {
            var sb = new StringBuilder(targetSizeKb * 1024 + 512);
            sb.Append("{");
            sb.Append("\"TypeName\":\"product\",");
            sb.Append("\"CategoryCode\":1,");
            sb.Append("\"Label\":\"Product\",");
            sb.Append("\"IsAction\":false,");
            sb.Append("\"IsActionMember\":false,");
            sb.Append("\"IsTrackingEnabled\":true,");
            sb.Append("\"IsAvailableLocal\":true,");
            sb.Append("\"IsChildRecord\":false,");
            sb.Append("\"IsLinksEnabled\":true,");
            sb.Append("\"IsCustomRecord\":false,");
            sb.Append("\"PrimaryKeyField\":\"productid\",");
            sb.Append("\"PrimaryLabelField\":\"title\",");
            sb.Append("\"Fields\":[");
            int targetBytes = targetSizeKb * 1024;
            int fieldIndex = 0;
            bool firstField = true;
            while (sb.Length < targetBytes - 512)
            {
                if (!firstField) sb.Append(",");
                firstField = false;
                sb.Append("{");
                sb.Append($"\"TypeName\":\"field_{fieldIndex}\",");
                sb.Append($"\"InternalName\":\"Field_{fieldIndex}\",");
                sb.Append($"\"FieldType\":\"String\",");
                sb.Append($"\"Label\":\"Field {fieldIndex}\",");
                sb.Append($"\"MaxSize\":100,");
                sb.Append($"\"IsReadable\":true,");
                sb.Append($"\"IsCreatable\":true,");
                sb.Append($"\"IsUpdatable\":true,");
                sb.Append($"\"IsTrackingEnabled\":false,");
                sb.Append($"\"IsPrimaryKey\":false,");
                sb.Append($"\"IsVirtual\":false,");
                sb.Append($"\"Requirement\":\"None\"");
                sb.Append("}");
                fieldIndex++;
            }
            sb.Append("]");
            sb.Append("}");
            return sb.ToString();
        }
    
        [Benchmark]
        public void TokenSerialization()
        {
            var stream = t_stream ??= new MemoryStream(64 * 1024);
            stream.Position = 0;
            stream.SetLength(0);
            var writer = t_writer;
            if (writer == null)
            {
                writer = new Utf8JsonWriter(stream, new JsonWriterOptions { SkipValidation = true });
                t_writer = writer;
            }
            else
                writer.Reset(stream);
            writer.WriteStartObject();
            writer.WriteStartArray("Catalog");
            foreach (var token in _tokenObjects)
            {
                if (token is string strToken)
                {
                    if (!string.IsNullOrEmpty(strToken))
                        writer.WriteRawValue(strToken);
                }
                else if (token is Dictionary<string, object> dictToken)
                {
                    writer.WriteStartObject();
                    foreach (var kvp in dictToken)
                    {
                        writer.WritePropertyName(kvp.Key);
                        JsonSerializer.Serialize(writer, kvp.Value);
                    }
                    writer.WriteEndObject();
                }
            }
            writer.WriteEndArray();
            writer.WriteEndObject();
            writer.Flush();
            if (stream.Length == 0) throw new Exception("unreachable");
        }
    }
  15. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Benchmark job submitted. The results will be posted here once they are ready.

  16. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    macos15_helix_arm64 — Failed

    @EgorBo

    Agent failed with exit code 1

    Job | Full logs

  17. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    ubuntu24_aws_genoa — Failed

    @EgorBo

    Agent failed with exit code 1

    Job | Full logs

  18. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    ubuntu24_aws_graviton4 — Failed

    @EgorBo

    Agent failed with exit code 1

    Job | Full logs

  19. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    ubuntu24_azure_cobalt100 — Failed

    @EgorBo

    Agent failed with exit code 1

    Job | Full logs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions