File: RouteTableFactoryBenchmarks.cs
Web Access
Project: src\src\Components\Components\perf\Microsoft.AspNetCore.Components.Performance.csproj (Microsoft.AspNetCore.Components.Performance)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
 
namespace Microsoft.AspNetCore.Components.Performance;
 
public class RouteTableFactoryBenchmarks
{
    private const int NumRoutes = 3000;
 
    private IServiceProvider _serviceProvider;
    private Dictionary<Type, string[]> _templatesByHandler;
 
    public RouteTableFactoryBenchmarks()
    {
        _serviceProvider = new ServiceCollection()
            .AddLogging()
            .BuildServiceProvider();
 
        _templatesByHandler = new Dictionary<Type, string[]>
        {
            { typeof(object), GenerateRoutes() }
        };
    }
 
    private string[] GenerateRoutes()
    {
        ReadOnlySpan<string> segments1 = ["first", "second", "third", "fourth", "fifth", "sixth", "{parameter1}"];
        ReadOnlySpan<string> segments2 = ["apple", "banana", "cake", "dates", "eggs", "flour", "{parameter2}"];
        ReadOnlySpan<string> segments3 = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "{parameter3}"];
        ReadOnlySpan<string> segments4 = ["create", "read", "update", "delete", "list"];
 
        var routes = new string[NumRoutes];
        var i = 0;
 
        foreach (var segment1 in segments1)
        {
            if (i >= routes.Length)
            {
                break;
            }
            routes[i++] = $"/{segment1}";
 
            foreach (var segment2 in segments2)
            {
                if (i >= routes.Length)
                {
                    break;
                }
 
                routes[i++] = $"/{segment1}/{segment2}";
 
                foreach (var segment3 in segments3)
                {
                    if (i >= routes.Length)
                    {
                        break;
                    }
 
                    routes[i++] = $"/{segment1}/{segment2}/{segment3}";
 
                    foreach (var segment4 in segments4)
                    {
                        if (i >= routes.Length)
                        {
                            break;
                        }
 
                        routes[i++] = $"/{segment1}/{segment2}/{segment3}/{segment4}";
                    }
                }
            }
        }
 
        return routes;
    }
 
    [Benchmark]
    public object CreateRouteTable() => RouteTableFactory.Create(_templatesByHandler, _serviceProvider);
 
}