WebApiClient性能参考
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在一个数量级,大家放心地使用就是了。
WebApiClient性能参考的更多相关文章
- top命令的Load average 含义及性能参考基值
$ uptime11:12:26 up 3:44, 4 users, load average: 0.38, 0.31, 0.19 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树.如果一个 ...
- 杂谈WebApiClient的性能优化
前言 WebApiClient的netcoreapp版本的开发已接近尾声,最后的进攻方向是性能的压榨,我把我所做性能优化的过程介绍给大家,大家可以依葫芦画瓢,应用到自己的实际项目中,提高程序的性能. ...
- GJM :Unity3D 5.x性能分析工具与应用方法
原帖地址 http://gad.qq.com/content/coursedetail/7180616 Unity Profiler Unity => Window=>Profiler P ...
- GJM : FlatBuffers 与 protobuf 性能比较 [转载 ]
原帖地址:http://blog.csdn.net/menggucaoyuan/article/details/34409433 原作者:企鹅 menggucaoyuan 未经原作者同意不允许转载 ...
- 【性能测试】性能测试总结<一>
目录: 一. 什么是软件性能 二.不同群体眼中的性能 三.性能测试类型 四.性能测试应用场景 五.性能测试基本概念 正文: 一. 什么是软件性能 定义:软件的性能是软件的一种非功能特性,它关注的不是软 ...
- FlatBuffers与protobuf性能比较
FlatBuffers发布时,顺便也公布了它的性能数据,具体数据请见Benchmark. 它的测试用例由以下数据构成"a set of about 10 objects containing ...
- zabbix的日常监控-磁盘性能监控(十二)
监控磁盘的性能 参考文章: https://wiki.enchtex.info/howto/zabbix/zabbix_iostat_monitoring https://blog.csdn.net/ ...
- 第一章 -- Java性能调优概述
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 1.概述 2 ...
- 《Oracle RAC性能优化》
一 RAC环境 RAC架构,2节点信息 节点1 SQL> show parameter instance NAME TYPE ...
随机推荐
- NC使用练习之通达OA-2017版本漏洞复现后续
利用上一篇通达OA的漏洞环境,练习NC工具的使用. 步骤: 1.本机启动nc.exe监听端口: 确认端口是否成功监听成功: 2.用冰蝎将nc.exe上传至目标机: 3.用命令行在目标机启动nc.exe ...
- linux sort 命令实用手册
Linux 中的sort 命令是一个很实用的工具,用于对文本内容以行为单位进行ASCII 码排序,默认按照升序进行排序(当然也可以按照降序). sort 命令的格式如下: sort `参数` `文件名 ...
- opencv-4-成像系统与Mat图像颜色空间
opencv-4-成像系统与Mat图像颜色空间 opencvc++qtmat 目标 知道 opencv 处理图像数据的格式 介绍 mat 基础内容 知道 BGR 颜色 显示 颜色转换 BGR 到 灰度 ...
- XEP-0199 XMPP Ping
原文来自:https://xmpp.org/extensions/xep-0199.html,只翻译了技术方面的内容. 摘要:这个规范定义了一个通过XML流发送应用级别pings的XMPP扩展协议.这 ...
- 【Linux常见问题】CentOS 7 root用户密码忘记,找回密码方法
1.开机按esc 2.选择CentOS Linux (3.10.0-693.......) 按 e 键: 3.光标移动到 linux 16 开头的行,找到 ro 改为 rw init=sysr ...
- CC视频CTO栗伟:CDN系统架构及CC视频应用实践
2017 年 11 月9日,CC视频获2.08 亿元C轮融资. EGO 北京分会会员.CC视频CTO栗伟获邀作为 EGO 线上分享第三季嘉宾,与大家交流了CDN系统架构及CC 视频的应用实践. \\ ...
- 最新Idea超实用告别996插件,都是免费
Idea告别996插件 在IntelliJ IDEA中,秉着IDEA自带能实现的快捷方式就不用插件的原则,少用些插件,运行性能也提升一些,虽然很少,哈哈.分享下我个人常用的插件,希望对大家有些帮助.插 ...
- auto_ptr和shared_ptr
<Effective C++>在资源管理一节提到了智能指针,智能指针中最著名的当属auto_ptr和shared_ptr.本文主要研究两者的实现. auto_ptr的实现: templat ...
- ES[7.6.x]学习笔记(六)分析器
在前面的章节中,我们给大家介绍了索引中的映射类型,也就是每一个字段都有一个类型,比如:long,text,date等.这和我们的数据库非常的相似,那么它的不同之处是什么呢?对了,就是全文索引,在ES当 ...
- 详解十大经典数据挖掘算法之——Apriori
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第19篇文章,我们来看经典的Apriori算法. Apriori算法号称是十大数据挖掘算法之一,在大数据时代威风无两,哪 ...