欢迎访问欧博亚洲(Allbet Game)!

首页科技正文

allbet开户:WebApiClient性能参考

admin2020-05-2218

1 文章目的

昨天写了走进WebApiClientCore的设计,先容了WebApiClient的转变与设计之后,收到人人支持的、赞许的,另有好的建媾和挂念,好比WebApiClient性能怎么样,有没有一些对比参考值?我一直有个欠好偏差,凭直接感观代码的运行效率,直觉里WebApiClient的代码都是优化的,就算性能欠好,也没有更好的性能填补方案!但真要这样和使用这个库的开发者说,信赖要一秒内被打屎的,以是今天使用了BenchmarkDotNet对WebApiClient.JIT最新稳固版、WebApiClientCore预览版和原生的HttpClient做了请求和响应处置耗时对比。

2 清扫网络IO守候滋扰

我们必须要想设施去掉真实网络请求的时间滋扰,由于一个请求回合中,网络守候时间可能会占用到整个流程的99.99%以上的时间。最好的设施就是没有请求,而是模拟一个响应内容。

System.Net.Http支持管道式包装请求处置工具,叫DelegatingHandler,我们可以自定义一个DelegatingHandler,重写其SendAsync()方式,然后直接返回模拟的响应新闻HttpResponseMessage,使用这个DelegatingHandler的HttpClient,在请求时不会真实将数据发送到目的服务器去。

/// <summary>
/// 无真实http请求的Handler
/// </summary>
class NoneHttpDelegatingHandler : DelegatingHandler
{
    private readonly HttpResponseMessage benchmarkModelResponseMessage;

    public NoneHttpDelegatingHandler()
    {
        var model = new Model { A = "A", B = 2, C = 3d };
        var json = JsonSerializer.SerializeToUtf8Bytes(model);
        this.benchmarkModelResponseMessage = new HttpResponseMessage(HttpStatusCode.OK) { Content = new JsonContent(json) };
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        return Task.FromResult(this.benchmarkModelResponseMessage);
    }
}

3 Benchmark测试

3.1 注册到DI

为了公正,三种对比工具都注册到到DI里,使用时从DI获取实例

var services = new ServiceCollection();

// 原生HttpClient
services
    .AddHttpClient(typeof(HttpClient).FullName)
    .AddHttpMessageHandler(() => new NoneHttpDelegatingHandler());

// WebApiClientCore
services
    .AddHttpApi<IWebApiClientCoreApi>(o => o.HttpHost = new Uri("http://webapiclient.com/"))
    .AddHttpMessageHandler(() => new NoneHttpDelegatingHandler());

// WebApiClient
WebApiClient.Extension
    .AddHttpApi<IWebApiClientApi>(services, o => o.HttpHost = new Uri("http://webapiclient.com/"))
    .AddHttpMessageHandler(() => new NoneHttpDelegatingHandler());

3.2 Benchmark方式

我们为三种客户端每个对照项目各写一个Benchmark方式:从DI获取实例,然后提议Get请求,最后将响应的内容反序列化为强模子。

/// <summary>
/// 使用WebApiClient.JIT请求
/// </summary>
/// <returns></returns>
[Benchmark]
public async Task<Model> WebApiClient_GetAsync()
{
    using var scope = this.serviceProvider.CreateScope();
    var banchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientApi>();
    return await banchmarkApi.GetAsyc(id: "id");
}

/// <summary>
/// 使用WebApiClientCore请求
/// </summary>
/// <returns></returns>
[Benchmark]
public async Task<Model> WebApiClientCore_GetAsync()
{
    using var scope = this.serviceProvider.CreateScope();
    var banchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreApi>();
    return await banchmarkApi.GetAsyc(id: "id");
}

/// <summary>
/// 使用原生HttpClient请求
/// </summary>
/// <returns></returns>
[Benchmark]
public async Task<Model> HttpClient_GetAsync()
{
    using var scope = this.serviceProvider.CreateScope();
    var httpClient = scope.ServiceProvider.GetRequiredService<IHttpClientFactory>().CreateClient(typeof(HttpClient).FullName);

    var id = "id";
    var request = new HttpRequestMessage(HttpMethod.Get, $"http://webapiclient.com/{id}");
    var response = await httpClient.SendAsync(request);
    var json = await response.Content.ReadAsByteArrayAsync();
    return JsonSerializer.Deserialize<Model>(json);
}

3.3 Benchmark运行与效果

原于代码篇幅,现实中我们还加入了Post请求测试,以是最后的效果如下:

BenchmarkDotNet=v0.12.1, OS=Windows 10.0.18363.836 (1909/November2018Update/19H2)
Intel Core i7-8565U CPU 1.80GHz (Whiskey Lake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.1.201
  [Host]     : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT
  DefaultJob : .NET Core 3.1.3 (CoreCLR 4.700.20.11803, CoreFX 4.700.20.12001), X64 RyuJIT


|                     Method |      Mean |     Error |    StdDev |
|--------------------------- |----------:|----------:|----------:|
|      WebApiClient_GetAsync | 25.716 us | 0.5106 us | 0.9838 us |
|  WebApiClientCore_GetAsync | 16.047 us | 0.1231 us | 0.0961 us |
|        HttpClient_GetAsync |  2.028 us | 0.0240 us | 0.0224 us |
|     WebApiClient_PostAsync | 18.712 us | 0.3707 us | 0.3641 us |
| WebApiClientCore_PostAsync |  8.799 us | 0.1696 us | 0.1666 us |
|       HttpClient_PostAsync |  3.673 us | 0.0710 us | 0.0972 us |

总结

不管是成熟稳固如狗的WebApiClient,照样新秀WebApiClientCore,其性能和原生的HttpClient在一个数量级,人人放心地使用就是了。

,

欧博注册网址

www.goldo.cn欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。

|

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源:欧博亚洲(Allbet Game)!

本文链接:http://www.czshenhaifb.com/post/1156.html

网友评论