File: HttpResilienceBenchmark.cs
Web Access
Project: src\bench\Libraries\Microsoft.Extensions.Http.Resilience.PerformanceTests\Microsoft.Extensions.Http.Resilience.PerformanceTests.csproj (Microsoft.Extensions.Http.Resilience.PerformanceTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
 
namespace Microsoft.Extensions.Http.Resilience.PerformanceTests;
 
public class HttpResilienceBenchmark
{
    private static readonly Uri _uri = new(HttpClientFactory.PrimaryEndpoint);
 
    private HttpClient _client = null!;
    private HttpClient _standardClient = null!;
    private HttpClient _singleHandlerClient = null!;
    private HttpClient _hedgingClientOrdered = null!;
    private HttpClient _hedgingClientNoRoutes = null!;
 
    private static HttpRequestMessage Request
    {
        get
        {
            var request = new HttpRequestMessage(HttpMethod.Post, _uri);
            request.Options.Set(new HttpRequestOptionsKey<string>("dummy"), "dummy");
            return request;
        }
    }
 
    [GlobalSetup]
    public void GlobalSetup()
    {
        var serviceProvider = HttpClientFactory.InitializeServiceProvider(HedgingClientType.Ordered, HedgingClientType.NoRoutes);
        var factory = serviceProvider.GetRequiredService<IHttpClientFactory>();
        _client = factory.CreateClient(HttpClientFactory.EmptyClient);
        _standardClient = factory.CreateClient(HttpClientFactory.StandardClient);
        _singleHandlerClient = factory.CreateClient(HttpClientFactory.SingleHandlerClient);
        _hedgingClientNoRoutes = factory.CreateClient(nameof(HedgingClientType.NoRoutes));
        _hedgingClientOrdered = factory.CreateClient(nameof(HedgingClientType.Ordered));
    }
 
    [Benchmark(Baseline = true)]
    public Task<HttpResponseMessage> DefaultClient()
    {
        return _client.SendAsync(Request, CancellationToken.None);
    }
 
    [Benchmark]
    public Task<HttpResponseMessage> SingleHandler()
    {
        return _singleHandlerClient.SendAsync(Request, CancellationToken.None);
    }
 
    [Benchmark]
    public Task<HttpResponseMessage> StandardResilienceHandler()
    {
        return _standardClient.SendAsync(Request, CancellationToken.None);
    }
 
    [Benchmark]
    public Task<HttpResponseMessage> StandardHedgingHandler_RoutesFromRequest()
    {
        return _hedgingClientNoRoutes.SendAsync(Request, CancellationToken.None);
    }
 
    [Benchmark]
    public Task<HttpResponseMessage> StandardHedgingHandler_RoutesFromConfig()
    {
        return _hedgingClientOrdered.SendAsync(Request, CancellationToken.None);
    }
}