-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFileStreamReadBenchmark.cs
More file actions
96 lines (84 loc) · 2 KB
/
Copy pathFileStreamReadBenchmark.cs
File metadata and controls
96 lines (84 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using BenchmarkDotNet.Attributes;
using Open.IO.Extensions;
using System;
using System.Threading.Tasks;
namespace Open.Text.CSV.Test;
public class FileStreamReadBenchmark : FileReadBenchmarkBase
{
public FileStreamReadBenchmark(string testFile = null) : base(testFile) { }
/*
* NOTES:
*
* There should be no difference between FileStream_ReadAsync and FileStream_SingleBufferReadAsync
* as they are fundamentally the same except for FileStream_SingleBufferReadAsync
* might have a larger buffer from the pool.
*/
[Benchmark(Baseline = true)]
public int FileStream_Read()
{
var count = 0;
int next;
var buffer = new byte[ByteBufferSize];
var span = buffer.AsSpan();
using var stream = GetStream();
while ((next = stream.Read(span)) is not 0)
count += next;
return count;
}
//[Benchmark]
public async Task<int> FileStream_ReadAsync()
{
var count = 0;
int next;
var buffer = new byte[ByteBufferSize];
var mem = buffer.AsMemory();
using var stream = GetStream();
while ((next = await stream
.ReadAsync(mem)
.ConfigureAwait(false)) is not 0)
{
count += next;
}
return count;
}
[Benchmark]
public async Task<long> FileStream_SingleBufferReadAsync()
{
long count = 0;
using var stream = GetStream();
await foreach (var buffer in stream
.SingleBufferReadAsync(ByteBufferSize)
.ConfigureAwait(false))
{
count += buffer.Length;
}
return count;
}
[Benchmark]
public async Task<long> FileStream_DualBufferReadAsync()
{
long count = 0;
using var stream = GetStream();
await foreach (var buffer in stream
.DualBufferReadAsync(ByteBufferSize)
.ConfigureAwait(false))
{
count += buffer.Length;
}
return count;
}
[Benchmark]
public async Task<long> FileStream_DualBufferReadAsync_Yielded()
{
long count = 0;
using var stream = GetStream();
await foreach (var buffer in stream
.DualBufferReadAsync(ByteBufferSize)
.ConfigureAwait(false))
{
count += buffer.Length;
await Task.Yield();
}
return count;
}
}