Skip to content

Commit add0c00

Browse files
committed
加上批量任务处理的性能测试
1 parent 7532d5a commit add0c00

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed

docs/Benchmark.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,11 @@ Job=InProcess Toolchain=InProcessEmitToolchain
4747
| | | | | | | | | | | |
4848
| **DoubleBufferTaskWithMultiThreadReadAndWrite** | **5** | **1,193.8 us** | **23.31 us** | **39.59 us** | **?** | **?** | **21.4844** | **-** | **-** | **88.33 KB** |
4949
| | | | | | | | | | | |
50-
| **DoubleBufferTaskWithMultiThreadReadAndWrite** | **10** | **1,120.2 us** | **22.31 us** | **28.21 us** | **?** | **?** | **21.4844** | **-** | **-** | **89.38 KB** |
50+
| **DoubleBufferTaskWithMultiThreadReadAndWrite** | **10** | **1,120.2 us** | **22.31 us** | **28.21 us** | **?** | **?** | **21.4844** | **-** | **-** | **89.38 KB** |
51+
52+
### DoubleBufferTask with Batch task
53+
54+
| Method | Mean | Error | StdDev | Ratio | Gen 0 | Gen 1 | Gen 2 | Allocated |
55+
|------------------------------------------------ |-------------:|----------:|----------:|------:|------:|------:|------:|----------:|
56+
| DoubleBufferTaskReadAndWriteTestWithMultiThread | 31.50 ms | 0.597 ms | 0.587 ms | 0.002 | - | - | - | 90.67 KB |
57+
| ChannelReadAndWriteTestWithMultiThread | 15,791.17 ms | 43.934 ms | 41.095 ms | 1.000 | - | - | - | 645.11 KB |
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
using BenchmarkDotNet.Attributes;
5+
using dotnetCampus.Threading;
6+
7+
namespace AsyncWorkerCollection.Benchmarks
8+
{
9+
/// <summary>
10+
/// 批量任务的双缓存性能对比
11+
/// </summary>
12+
[BenchmarkCategory(nameof(BatchProducerAndConsumerDoubleBufferReadAndWriteTests))]
13+
public class BatchProducerAndConsumerDoubleBufferReadAndWriteTests
14+
{
15+
[Benchmark()]
16+
public async Task DoubleBufferTaskReadAndWriteTestWithMultiThread()
17+
{
18+
const int threadCount = 1;
19+
20+
var doubleBufferTask = new DoubleBufferTask<List<Foo>, Foo>(new List<Foo>(MaxCount),
21+
new List<Foo>(MaxCount), async list =>
22+
{
23+
await StartDo();
24+
});
25+
var foo = new Foo();
26+
27+
var taskList = new Task[threadCount];
28+
29+
for (int j = 0; j < threadCount; j++)
30+
{
31+
var task = Task.Run(() =>
32+
{
33+
for (int i = 0; i < MaxCount / threadCount; i++)
34+
{
35+
doubleBufferTask.AddTask(foo);
36+
}
37+
});
38+
taskList[j] = task;
39+
}
40+
41+
await Task.WhenAll(taskList);
42+
43+
doubleBufferTask.Finish();
44+
await doubleBufferTask.WaitAllTaskFinish();
45+
}
46+
47+
[Benchmark(Baseline = true)]
48+
public async Task ChannelReadAndWriteTestWithMultiThread()
49+
{
50+
var foo = new Foo();
51+
var bounded = System.Threading.Channels.Channel.CreateBounded<Foo>(MaxCount);
52+
53+
var task = Task.Run(async () =>
54+
{
55+
int n = 0;
56+
57+
await foreach (var temp in bounded.Reader.ReadAllAsync())
58+
{
59+
await StartDo();
60+
n++;
61+
if (n == MaxCount)
62+
{
63+
break;
64+
}
65+
}
66+
});
67+
68+
for (int i = 0; i < MaxCount; i++)
69+
{
70+
await bounded.Writer.WriteAsync(foo);
71+
}
72+
73+
await task;
74+
}
75+
76+
/// <summary>
77+
/// 开始执行,如文件写入等,无论是写入多少条,都需要有开始的时间
78+
/// </summary>
79+
private async Task StartDo()
80+
{
81+
await Task.Delay(TimeSpan.FromMilliseconds(10));
82+
}
83+
84+
private const int MaxCount = 1000;
85+
86+
class Foo
87+
{
88+
}
89+
}
90+
}

0 commit comments

Comments
 (0)