Skip to content

Commit e8e9e15

Browse files
committed
Merge branch 'karpinsn-master'
2 parents 2757754 + b695103 commit e8e9e15

File tree

5 files changed

+120
-0
lines changed

5 files changed

+120
-0
lines changed

CsvHelper.sln

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CsvHelper.Tests", "tests\Cs
2020
EndProject
2121
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CsvHelper.Website", "src\CsvHelper.Website\CsvHelper.Website.csproj", "{3E59CA52-D248-4CBB-BB06-270FA942C4B8}"
2222
EndProject
23+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsvHelper.Benchmarks", "performance\CsvHelper.Benchmarks\CsvHelper.Benchmarks.csproj", "{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}"
24+
EndProject
2325
Global
2426
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2527
Debug|Any CPU = Debug|Any CPU
@@ -94,6 +96,26 @@ Global
9496
{3E59CA52-D248-4CBB-BB06-270FA942C4B8}.Release|x64.Build.0 = Release|Any CPU
9597
{3E59CA52-D248-4CBB-BB06-270FA942C4B8}.Release|x86.ActiveCfg = Release|Any CPU
9698
{3E59CA52-D248-4CBB-BB06-270FA942C4B8}.Release|x86.Build.0 = Release|Any CPU
99+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
100+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
101+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|ARM.ActiveCfg = Debug|Any CPU
102+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|ARM.Build.0 = Debug|Any CPU
103+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
104+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
105+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|x64.ActiveCfg = Debug|Any CPU
106+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|x64.Build.0 = Debug|Any CPU
107+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|x86.ActiveCfg = Debug|Any CPU
108+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Debug|x86.Build.0 = Debug|Any CPU
109+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
110+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|Any CPU.Build.0 = Release|Any CPU
111+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|ARM.ActiveCfg = Release|Any CPU
112+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|ARM.Build.0 = Release|Any CPU
113+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
114+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
115+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|x64.ActiveCfg = Release|Any CPU
116+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|x64.Build.0 = Release|Any CPU
117+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|x86.ActiveCfg = Release|Any CPU
118+
{4DAB88D4-56B0-C42A-25BB-3E5BBCBB5F1B}.Release|x86.Build.0 = Release|Any CPU
97119
EndGlobalSection
98120
GlobalSection(SolutionProperties) = preSolution
99121
HideSolutionNode = FALSE
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System;
2+
using System.Globalization;
3+
using System.IO;
4+
5+
using BenchmarkDotNet.Attributes;
6+
7+
namespace CsvHelper.Benchmarks;
8+
9+
[MemoryDiagnoser]
10+
public class BenchmarkEnumerateRecords
11+
{
12+
private const int entryCount = 10000;
13+
private readonly MemoryStream stream = new();
14+
15+
public class Simple
16+
{
17+
public int Id { get; set; }
18+
public string Name { get; set; }
19+
}
20+
21+
[GlobalSetup]
22+
public void GlobalSetup()
23+
{
24+
using var streamWriter = new StreamWriter(this.stream, null, -1, true);
25+
using var writer = new CsvWriter(streamWriter, CultureInfo.InvariantCulture, true);
26+
var random = new Random(42); // Pick a known seed to keep things consistent
27+
28+
var chars = new char[10];
29+
string getRandomString()
30+
{
31+
for (int i = 0; i < 10; ++i)
32+
chars[i] = (char)random.Next('a', 'z' + 1);
33+
return new string(chars);
34+
}
35+
36+
writer.WriteHeader(typeof(Simple));
37+
writer.NextRecord();
38+
for (int i = 0; i < BenchmarkEnumerateRecords.entryCount; ++i)
39+
{
40+
writer.WriteRecord(new Simple()
41+
{
42+
Id = random.Next(),
43+
Name = getRandomString()
44+
});
45+
writer.NextRecord();
46+
}
47+
}
48+
49+
[GlobalCleanup]
50+
public void GlobalCleanup()
51+
{
52+
this.stream.Dispose();
53+
}
54+
55+
[Benchmark]
56+
public void EnumerateRecords()
57+
{
58+
this.stream.Position = 0;
59+
using var streamReader = new StreamReader(this.stream, null, true, -1, true);
60+
using var csv = new CsvReader(streamReader, CultureInfo.InvariantCulture, true);
61+
foreach (var record in csv.GetRecords<Simple>())
62+
{
63+
_ = record;
64+
}
65+
}
66+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using BenchmarkDotNet.Running;
2+
3+
namespace CsvHelper.Benchmarks;
4+
5+
internal class BenchmarkMain
6+
{
7+
static void Main(string[] args)
8+
{
9+
_ = BenchmarkRunner.Run<BenchmarkEnumerateRecords>();
10+
}
11+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net9.0</TargetFramework>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<PackageReference Include="BenchmarkDotNet" Version="0.15.0" />
10+
</ItemGroup>
11+
12+
<ItemGroup>
13+
<ProjectReference Include="..\..\src\CsvHelper\CsvHelper.csproj" />
14+
</ItemGroup>
15+
16+
</Project>

src/CsvHelper/ObjectCreator.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ public object CreateInstance(Type type, params object?[] args)
5353
[MethodImpl(MethodImplOptions.AggressiveInlining)]
5454
private static Type[] GetArgTypes(object?[] args)
5555
{
56+
if (args.Length == 0)
57+
{
58+
return Array.Empty<Type>();
59+
}
60+
5661
var argTypes = new Type[args.Length];
5762
for (var i = 0; i < args.Length; i++)
5863
{

0 commit comments

Comments
 (0)