Skip to content

Commit a3dd2e7

Browse files
more improvements
1 parent a250e32 commit a3dd2e7

17 files changed

+610
-632
lines changed

benchmark/Data.cs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
using System;
22

3-
namespace Parsers.Benchmarks
3+
namespace Parsers.Benchmarks;
4+
5+
[ParserOutput]
6+
public class Data
47
{
5-
[ParserOutput]
6-
public class Data
7-
{
8-
[ArrayIndex(0)]
9-
public string Name { get; set; }
8+
[ArrayIndex(0)]
9+
public string Name { get; set; }
1010

11-
[ArrayIndex(2)]
12-
public int Number { get; set; }
11+
[ArrayIndex(2)]
12+
public int Number { get; set; }
1313

14-
[ArrayIndex(1)]
15-
public DateTime Birthday { get; set; }
16-
}
17-
}
14+
[ArrayIndex(1)]
15+
public DateTime Birthday { get; set; }
16+
}

benchmark/GetParser_Benchmark.cs

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,45 @@
11
using System;
22
using BenchmarkDotNet.Attributes;
33

4-
namespace Parsers.Benchmarks
4+
namespace Parsers.Benchmarks;
5+
6+
// ReSharper disable once InconsistentNaming
7+
[MemoryDiagnoser]
8+
public class GetParser_Benchmark
59
{
6-
// ReSharper disable once InconsistentNaming
7-
[MemoryDiagnoser]
8-
public class GetParser_Benchmark
9-
{
10-
private EmitIlParserFactory _emitIlParserFactory;
11-
private ExpressionTreeParserFactory _expressionTreeParserFactory;
12-
private SigilParserFactory _sigilParserFactory;
10+
private EmitIlParserFactory _emitIlParserFactory;
11+
private ExpressionTreeParserFactory _expressionTreeParserFactory;
12+
private SigilParserFactory _sigilParserFactory;
1313

14-
[GlobalSetup]
15-
public void GlobalSetup()
16-
{
17-
_emitIlParserFactory = new EmitIlParserFactory();
18-
_expressionTreeParserFactory = new ExpressionTreeParserFactory();
19-
_sigilParserFactory = new SigilParserFactory();
20-
}
14+
[GlobalSetup]
15+
public void GlobalSetup()
16+
{
17+
_emitIlParserFactory = new EmitIlParserFactory();
18+
_expressionTreeParserFactory = new ExpressionTreeParserFactory();
19+
_sigilParserFactory = new SigilParserFactory();
20+
}
2121

22-
[Benchmark]
23-
public Func<string[], Data> EmitIl()
24-
{
25-
return _emitIlParserFactory.GetParser<Data>();
26-
}
22+
[Benchmark]
23+
public Func<string[], Data> EmitIl()
24+
{
25+
return _emitIlParserFactory.GetParser<Data>();
26+
}
2727

28-
[Benchmark]
29-
public Func<string[], Data> ExpressionTree()
30-
{
31-
return _expressionTreeParserFactory.GetParser<Data>();
32-
}
28+
[Benchmark]
29+
public Func<string[], Data> ExpressionTree()
30+
{
31+
return _expressionTreeParserFactory.GetParser<Data>();
32+
}
3333

34-
[Benchmark]
35-
public Func<string[], Data> Sigil()
36-
{
37-
return _sigilParserFactory.GetParser<Data>();
38-
}
34+
[Benchmark]
35+
public Func<string[], Data> Sigil()
36+
{
37+
return _sigilParserFactory.GetParser<Data>();
38+
}
3939

40-
[Benchmark]
41-
public Func<string[], Data> Roslyn()
42-
{
43-
return RoslynParserInitializer.CreateFactory().GetParser<Data>();
44-
}
40+
[Benchmark]
41+
public Func<string[], Data> Roslyn()
42+
{
43+
return RoslynParserInitializer.CreateFactory().GetParser<Data>();
4544
}
46-
}
45+
}
Lines changed: 67 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,85 @@
11
using System;
22
using BenchmarkDotNet.Attributes;
33

4-
namespace Parsers.Benchmarks
4+
namespace Parsers.Benchmarks;
5+
6+
// ReSharper disable once InconsistentNaming
7+
[MemoryDiagnoser]
8+
public class ParserInvocation_Benchmark
59
{
6-
// ReSharper disable once InconsistentNaming
7-
[MemoryDiagnoser]
8-
public class ParserInvocation_Benchmark
9-
{
10-
private Func<string[], Data> _emitIlParser;
11-
private Func<string[], Data> _expressionTreeParser;
12-
private Func<string[], Data> _reflectionParser;
13-
private Func<string[], Data> _sigilParser;
14-
private Func<string[], Data> _roslynParser;
15-
private Func<string[], Data> _sourceGeneratorParser;
10+
private Func<string[], Data> _emitIlParser;
11+
private Func<string[], Data> _expressionTreeParser;
12+
private Func<string[], Data> _reflectionParser;
13+
private Func<string[], Data> _sigilParser;
14+
private Func<string[], Data> _roslynParser;
15+
private Func<string[], Data> _sourceGeneratorParser;
1616

17-
private static readonly string[] Input = { "one", "1994-11-05T13:15:30", "22" };
17+
private static readonly string[] Input = { "one", "1994-11-05T13:15:30", "22" };
1818

19-
[GlobalSetup]
20-
public void GlobalSetup()
21-
{
22-
_emitIlParser = new EmitIlParserFactory().GetParser<Data>();
23-
_expressionTreeParser = new ExpressionTreeParserFactory().GetParser<Data>();
24-
_reflectionParser = new ReflectionParserFactory().GetParser<Data>();
25-
_sigilParser = new SigilParserFactory().GetParser<Data>();
26-
_roslynParser = RoslynParserInitializer.CreateFactory().GetParser<Data>();
27-
// ReSharper disable once PossibleNullReferenceException
28-
_sourceGeneratorParser = ((IParserFactory)Activator.CreateInstance(Type.GetType("BySourceGenerator.Parser"))).GetParser<Data>();
29-
}
19+
[GlobalSetup]
20+
public void GlobalSetup()
21+
{
22+
_emitIlParser = new EmitIlParserFactory().GetParser<Data>();
23+
_expressionTreeParser = new ExpressionTreeParserFactory().GetParser<Data>();
24+
_reflectionParser = new ReflectionParserFactory().GetParser<Data>();
25+
_sigilParser = new SigilParserFactory().GetParser<Data>();
26+
_roslynParser = RoslynParserInitializer.CreateFactory().GetParser<Data>();
27+
// ReSharper disable once PossibleNullReferenceException
28+
_sourceGeneratorParser = ((IParserFactory)Activator.CreateInstance(Type.GetType("BySourceGenerator.Parser"))).GetParser<Data>();
29+
}
3030

31-
[Benchmark]
32-
public Data EmitIl()
33-
{
34-
return _emitIlParser.Invoke(Input);
35-
}
31+
[Benchmark]
32+
public Data EmitIl()
33+
{
34+
return _emitIlParser.Invoke(Input);
35+
}
3636

37-
[Benchmark]
38-
public Data ExpressionTree()
39-
{
40-
return _expressionTreeParser.Invoke(Input);
41-
}
37+
[Benchmark]
38+
public Data ExpressionTree()
39+
{
40+
return _expressionTreeParser.Invoke(Input);
41+
}
4242

43-
[Benchmark]
44-
public Data Reflection()
45-
{
46-
return _reflectionParser.Invoke(Input);
47-
}
43+
[Benchmark]
44+
public Data Reflection()
45+
{
46+
return _reflectionParser.Invoke(Input);
47+
}
4848

49-
[Benchmark]
50-
public Data Sigil()
51-
{
52-
return _sigilParser.Invoke(Input);
53-
}
49+
[Benchmark]
50+
public Data Sigil()
51+
{
52+
return _sigilParser.Invoke(Input);
53+
}
5454

55-
[Benchmark]
56-
public Data Roslyn()
55+
[Benchmark]
56+
public Data Roslyn()
57+
{
58+
return _roslynParser.Invoke(Input);
59+
}
60+
61+
[Benchmark]
62+
public Data SourceGenerator()
63+
{
64+
return _sourceGeneratorParser.Invoke(Input);
65+
}
66+
67+
[Benchmark(Baseline = true)]
68+
public Data ManuallyWritten()
69+
{
70+
var data = new Data();
71+
if (0 < Input.Length)
5772
{
58-
return _roslynParser.Invoke(Input);
73+
data.Name = Input[0];
5974
}
60-
61-
[Benchmark]
62-
public Data SourceGenerator()
75+
if (1 < Input.Length && DateTime.TryParse(Input[1], out var bd))
6376
{
64-
return _sourceGeneratorParser.Invoke(Input);
77+
data.Birthday = bd;
6578
}
66-
67-
[Benchmark(Baseline = true)]
68-
public Data ManuallyWritten()
79+
if (2 < Input.Length && int.TryParse(Input[2], out var n))
6980
{
70-
var data = new Data();
71-
if (0 < Input.Length)
72-
{
73-
data.Name = Input[0];
74-
}
75-
if (1 < Input.Length && DateTime.TryParse(Input[1], out var bd))
76-
{
77-
data.Birthday = bd;
78-
}
79-
if (2 < Input.Length && int.TryParse(Input[2], out var n))
80-
{
81-
data.Number = n;
82-
}
83-
return data;
81+
data.Number = n;
8482
}
83+
return data;
8584
}
86-
}
85+
}

benchmark/Program.cs

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,17 @@
11
using BenchmarkDotNet.Running;
2+
using Parsers.Benchmarks;
23

3-
namespace Parsers.Benchmarks
4+
var mode = args.Length == 1 ? args[0] : "all";
5+
switch (mode)
46
{
5-
class Program
6-
{
7-
private const string AllMode = "all";
8-
private const string GetParserMode = "gp";
9-
private const string ParserInvocationMode = "pi";
10-
11-
static void Main(string[] args)
12-
{
13-
var mode = args.Length == 1 ? args[0] : AllMode;
14-
15-
switch (mode)
16-
{
17-
case GetParserMode:
18-
BenchmarkRunner.Run<GetParser_Benchmark>();
19-
break;
20-
case ParserInvocationMode:
21-
BenchmarkRunner.Run<ParserInvocation_Benchmark>();
22-
break;
23-
default:
24-
BenchmarkRunner.Run<GetParser_Benchmark>();
25-
BenchmarkRunner.Run<ParserInvocation_Benchmark>();
26-
break;
27-
}
28-
}
29-
}
30-
}
7+
case "gp":
8+
BenchmarkRunner.Run<GetParser_Benchmark>();
9+
break;
10+
case "pi":
11+
BenchmarkRunner.Run<ParserInvocation_Benchmark>();
12+
break;
13+
default:
14+
BenchmarkRunner.Run<GetParser_Benchmark>();
15+
BenchmarkRunner.Run<ParserInvocation_Benchmark>();
16+
break;
17+
}

0 commit comments

Comments
 (0)