-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathWideRowReadSyncBenchmark.cs
150 lines (124 loc) · 4.29 KB
/
WideRowReadSyncBenchmark.cs
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using BenchmarkDotNet.Attributes;
namespace Cesil.Benchmark
{
[BenchmarkCategory("Read", "ComparesLibraries")]
public class WideRowReadSyncBenchmark
{
[ParamsSource(nameof(KnownRowSet))]
public string RowSet { get; set; }
public IEnumerable<string> KnownRowSet => new[] { nameof(WideRow.ShallowRows), nameof(WideRow.DeepRows) };
private IBoundConfiguration<WideRow> CesilConfig;
private CsvHelper.Configuration.CsvConfiguration CsvHelperConfig;
private string CSV;
private Func<TextReader, IEnumerable<WideRow>> DoCsvHelper;
private Func<TextReader, IEnumerable<WideRow>> DoCesil;
[GlobalSetup]
public void Initialize()
{
WideRow.Initialize();
// Configure Cesil
{
var opts = Options.CreateBuilder(Options.Default).WithWriteTrailingRowEnding(WriteTrailingRowEnding.Always).ToOptions();
CesilConfig = Configuration.For<WideRow>(opts);
}
// Configure CsvHelper
{
CsvHelperConfig = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture);
CsvHelperConfig.RegisterClassMap<WideRowMapping>();
}
CSV = MakeCSV();
DoCsvHelper = GetReadFunc(nameof(CsvHelper));
DoCesil = GetReadFunc(nameof(Cesil));
}
public void InitializeAndTest()
{
foreach (var set in KnownRowSet)
{
RowSet = set;
Initialize();
var toRead = CSV;
IEnumerable<WideRow> csvHelper, cesil;
using (var str = new StringReader(toRead))
{
csvHelper = DoCsvHelper(str);
}
using (var str = new StringReader(toRead))
{
cesil = DoCesil(str);
}
if (csvHelper.Count() != cesil.Count()) throw new Exception();
var rowCount = csvHelper.Count();
for (var j = 0; j < rowCount; j++)
{
var fRow = csvHelper.ElementAt(j);
var sRow = cesil.ElementAt(j);
if (!fRow.Equals(sRow)) throw new Exception();
}
}
}
[Benchmark(Baseline = true)]
public void CsvHelper()
{
using (var str = new StringReader(CSV))
{
DoCsvHelper(str);
}
}
[Benchmark]
public void Cesil()
{
using (var str = new StringReader(CSV))
{
DoCesil(str);
}
}
private string MakeCSV()
{
using (var str = new StringWriter())
{
using (var csv = CesilConfig.CreateWriter(str))
{
csv.WriteAll(GetRows(RowSet));
}
return str.ToString();
}
}
private IEnumerable<WideRow> GetRows(string forRowSet)
{
switch (forRowSet)
{
case nameof(WideRow.DeepRows): return WideRow.DeepRows;
case nameof(WideRow.ShallowRows): return WideRow.ShallowRows;
default: throw new InvalidOperationException();
}
}
private Func<TextReader, IEnumerable<WideRow>> GetReadFunc(string lib)
{
switch (lib)
{
case nameof(Cesil):
return (reader) =>
{
using (var csv = CesilConfig.CreateReader(reader))
{
return csv.ReadAll();
}
};
case nameof(CsvHelper):
return (reader) =>
{
using (var csv = new CsvHelper.CsvReader(reader, CsvHelperConfig))
{
return csv.GetRecords<WideRow>().ToList();
}
};
default: throw new Exception();
}
}
}
}