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

Benchmarks for dotnet/runtime#126678 (for @EgorBo) #108

Open

Description

@EgorBot

Processing benchmark request from PR dotnet/runtime#126678.

Targets: ubuntu24_aws_genoa
Commits: main;PR_126678

Results will be posted here once they are ready.

Activity

  1. 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 #126678 63.86 μs 0.044 μs 1.00 - NA
    TokenSerialization main 62.01 μs 0.032 μs 0.97 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126678
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    Full logs

  2. EgorBo commented on Apr 9, 2026

    @EgorBo

    @EgorBot -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");
        }
    }
  3. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

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

  4. 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 #126678 97.26 μs 0.032 μs 1.00 - NA
    TokenSerialization main 102.20 μs 0.050 μs 1.05 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126678
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    Full logs

  5. tannergooding commented on Apr 9, 2026

    @tannergooding

    @EgorBot -aws_amd -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");
        }
    }
  6. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

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

  7. EgorBot commented on Apr 9, 2026

    @EgorBot
    OwnerAuthor

    Results for ubuntu24_aws_genoa

    @tannergooding

    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 #126678 70.78 μs 0.308 μs 1.00 - NA
    TokenSerialization main 63.27 μs 0.025 μs 0.89 - NA
    Profiling artifacts

    Benchmarks.TokenSerialization:

    main PR_126678
    flamegraph link link
    functions link link
    asm link link
    stats link link
    speedscope link link

    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