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