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