Skip to content

Commit b94ef87

Browse files
committed
Benchmark分文件夹
1 parent fb881b3 commit b94ef87

File tree

7 files changed

+106
-85
lines changed

7 files changed

+106
-85
lines changed

WebApiClientCore.Benchmarks/GetAsModelContext.cs

Lines changed: 0 additions & 80 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace WebApiClientCore.Benchmarks
6+
{
7+
interface IBenchmark
8+
{
9+
}
10+
}

WebApiClientCore.Benchmarks/Program.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
using BenchmarkDotNet.Running;
22
using System;
3+
using System.Linq;
34

45
namespace WebApiClientCore.Benchmarks
56
{
67
class Program
78
{
89
static void Main(string[] args)
910
{
10-
BenchmarkRunner.Run<GetAsModelContext>();
11+
var benchmarkTypes = typeof(Program).Assembly.GetTypes().Where(item => typeof(IBenchmark).IsAssignableFrom(item));
12+
foreach(var item in benchmarkTypes)
13+
{
14+
BenchmarkRunner.Run(item);
15+
}
1116
Console.ReadLine();
1217
}
1318
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using BenchmarkDotNet.Attributes;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using System;
4+
using System.Net.Http;
5+
using System.Text.Json;
6+
using System.Threading.Tasks;
7+
8+
namespace WebApiClientCore.Benchmarks.RequestBenchmark
9+
{
10+
/// <summary>
11+
/// 跳过真实的http请求环节的模拟Get请求
12+
/// </summary>
13+
public class Benchmark : IBenchmark
14+
{
15+
private readonly IServiceProvider serviceProvider;
16+
17+
public Benchmark()
18+
{
19+
var model = new Model { A = "A", B = 2, C = 3d };
20+
var services = new ServiceCollection();
21+
22+
services
23+
.AddHttpApi<IBenchmarkApi>(o => o.HttpHost = new Uri("http://webapiclient.com/"))
24+
.AddHttpMessageHandler(() => new NoneHttpDelegatingHandler());
25+
26+
this.serviceProvider = services.BuildServiceProvider();
27+
}
28+
29+
/// <summary>
30+
/// 使用WebApiClientCore请求
31+
/// </summary>
32+
/// <returns></returns>
33+
[Benchmark]
34+
public async Task<Model> WebApiClientCore_GetAsync()
35+
{
36+
using var scope = this.serviceProvider.CreateScope();
37+
var banchmarkApi = scope.ServiceProvider.GetRequiredService<IBenchmarkApi>();
38+
return await banchmarkApi.GetAsyc(id: "id");
39+
}
40+
41+
/// <summary>
42+
/// 使用原生HttpClient请求
43+
/// </summary>
44+
/// <returns></returns>
45+
[Benchmark]
46+
public async Task<Model> HttpClient_GetAsync()
47+
{
48+
using var scope = this.serviceProvider.CreateScope();
49+
var httpClient = scope.ServiceProvider.GetRequiredService<IHttpClientFactory>().CreateClient(typeof(IBenchmarkApi).FullName);
50+
51+
var id = "id";
52+
var request = new HttpRequestMessage(HttpMethod.Get, $"http://webapiclient.com/{id}");
53+
var response = await httpClient.SendAsync(request);
54+
var json = await response.Content.ReadAsByteArrayAsync();
55+
return JsonSerializer.Deserialize<Model>(json);
56+
}
57+
}
58+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
using System.Threading.Tasks;
22
using WebApiClientCore.Attributes;
33

4-
namespace WebApiClientCore.Benchmarks
4+
namespace WebApiClientCore.Benchmarks.RequestBenchmark
55
{
66
public interface IBenchmarkApi
77
{
88
[HttpGet("/benchmarks/{id}")]
9-
public Task<BenchmarkModel> GetAsModelAsync([PathQuery] string id);
9+
Task<Model> GetAsyc([PathQuery] string id);
1010
}
1111
}

WebApiClientCore.Benchmarks/BenchmarkModel.cs renamed to WebApiClientCore.Benchmarks/RequestBenchmark/Model.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
namespace WebApiClientCore.Benchmarks
1+
namespace WebApiClientCore.Benchmarks.RequestBenchmark
22
{
3-
public class BenchmarkModel
3+
public class Model
44
{
55
public string A { get; set; }
66

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Net;
2+
using System.Net.Http;
3+
using System.Text.Json;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
7+
namespace WebApiClientCore.Benchmarks.RequestBenchmark
8+
{
9+
/// <summary>
10+
/// 无真实http请求的Handler
11+
/// </summary>
12+
class NoneHttpDelegatingHandler : DelegatingHandler
13+
{
14+
private readonly HttpResponseMessage benchmarkModelResponseMessage;
15+
16+
public NoneHttpDelegatingHandler()
17+
{
18+
var model = new Model { A = "A", B = 2, C = 3d };
19+
var json = JsonSerializer.SerializeToUtf8Bytes(model);
20+
this.benchmarkModelResponseMessage = new HttpResponseMessage(HttpStatusCode.OK) { Content = new JsonContent(json) };
21+
}
22+
23+
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
24+
{
25+
return Task.FromResult(this.benchmarkModelResponseMessage);
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)