Executando verificação de segurança...
1

O método foi bem simples, vou tentar deixar os detalhes aqui. Usei o pacote BenchmarkDotNet para realizar a medição e como você bem disse, apenas chamei a rota / de ambos os servidores configurados como mandei anteriormente, usei de fato kestrel para MinimalAPI, e basicamente envolvi o http.Start do servidor Sisk em um Task.Run() para que ambos rodassem e paralelo.

O start dos dois servidores foi dessa forma

Task.WaitAll(SiskApi(), MinimalApi());

E aqui está o código da medição.

public static class Program
{
    private static void Main() => BenchmarkRunner.Run<SiskVsMinimalBenckmark>();
}

public class SiskVsMinimalBenckmark
{
    private HttpClient? _httpClient;

    [GlobalSetup]
    public void Setup() => _httpClient = new HttpClient();

    [Benchmark]
    public async Task MinimalApi() => await _httpClient!.GetStringAsync("http://localhost:5221/");

    [Benchmark]
    public async Task SiskApi() => await _httpClient!.GetStringAsync("http://localhost:5222/");
}
Carregando publicação patrocinada...
1

Refiz os testes e consegui resultados um pouco melhores, mas ainda piores que o ASP.NET:

MethodMeanErrorStdDev
AspNetMinimal101.9 us1.13 us0.95 us
SiskDotNet108.4 us1.50 us1.40 us
SiskBFlat109.9 us1.58 us1.48 us

Também inclui um teste com o Sisk compilado com bflat. Achei que se sairia melhor porque não tinha toda aquela VM do .NET, mas acabou sendo pior.

Para melhorar os testes, eu desabilitei alguns switches de configuração do Sisk:

config.AccessLogsStream = null;  // o access logging pesa muito o processamento
config.Flags.NormalizeHeadersEncodings = false;
config.Flags.SendSiskHeader = false;
config.IncludeRequestIdHeader = false;

E também movi a resposta para um objeto, para não ter que computar o ByteArrayContent toda requisição. Não sei se é justo fazer isso, não sei como é no ASP.NET.

Acho que a diferença restantes dos 6,5 us é parte da implementação do soquete HTTP em si. Todas requisições foram feitas em HTTP plano, sem TLS. Aliás, o benchmark tá aqui se você quiser mais detalhes.

Fiquei feliz em ter aproximado o valor, fica mais competitivo.

1

Obrigado pelos detalhes!

Vou usar isso para diagnosticar a chamada de funções até entregar a resposta final e ver como posso otimizar ainda mais isso.