Skip to content

Commit 20aec07

Browse files
authored
Merge pull request #9 from akasarto/optimizedReaderReviewed
Optimized reader reviewed
2 parents 44994cc + 148d501 commit 20aec07

File tree

116 files changed

+26434
-512
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

116 files changed

+26434
-512
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,3 +251,6 @@ paket-files/
251251
.idea/
252252
*.sln.iml
253253
launchSettings.json
254+
255+
# Benchamarks
256+
**/BenchmarkDotNet.Artifacts/results

ApacheOrcDotNet.sln

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 16
4-
VisualStudioVersion = 16.0.31129.286
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.1.32319.34
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{58463841-CD45-4229-9E70-A0B74E70ADD7}"
77
ProjectSection(SolutionItems) = preProject
@@ -33,6 +33,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApacheOrcDotNet.OptimizedRe
3333
EndProject
3434
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApacheOrcDotNet.OptimizedReader.Test", "test\ApacheOrcDotNet.OptimizedReader.Test\ApacheOrcDotNet.OptimizedReader.Test.csproj", "{AE3C0606-2210-40ED-AE93-67DBD06461BE}"
3535
EndProject
36+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApacheOrcDotNet.OptimizedReaderTest.App", "src\ApacheOrcDotNet.OptimizedReaderTest.App\ApacheOrcDotNet.OptimizedReaderTest.App.csproj", "{E8C6F47D-51EE-4488-AF63-2898C01A6515}"
37+
EndProject
38+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "perf", "perf", "{23793296-3A05-4668-8967-364E6F73EE78}"
39+
EndProject
40+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicroBenchmarks", "perf\MicroBenchmarks\MicroBenchmarks.csproj", "{F03F6A0D-A431-4A8A-9ED3-FF4690051713}"
41+
EndProject
3642
Global
3743
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3844
Debug|Any CPU = Debug|Any CPU
@@ -63,6 +69,14 @@ Global
6369
{AE3C0606-2210-40ED-AE93-67DBD06461BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
6470
{AE3C0606-2210-40ED-AE93-67DBD06461BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
6571
{AE3C0606-2210-40ED-AE93-67DBD06461BE}.Release|Any CPU.Build.0 = Release|Any CPU
72+
{E8C6F47D-51EE-4488-AF63-2898C01A6515}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
73+
{E8C6F47D-51EE-4488-AF63-2898C01A6515}.Debug|Any CPU.Build.0 = Debug|Any CPU
74+
{E8C6F47D-51EE-4488-AF63-2898C01A6515}.Release|Any CPU.ActiveCfg = Release|Any CPU
75+
{E8C6F47D-51EE-4488-AF63-2898C01A6515}.Release|Any CPU.Build.0 = Release|Any CPU
76+
{F03F6A0D-A431-4A8A-9ED3-FF4690051713}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
77+
{F03F6A0D-A431-4A8A-9ED3-FF4690051713}.Debug|Any CPU.Build.0 = Debug|Any CPU
78+
{F03F6A0D-A431-4A8A-9ED3-FF4690051713}.Release|Any CPU.ActiveCfg = Release|Any CPU
79+
{F03F6A0D-A431-4A8A-9ED3-FF4690051713}.Release|Any CPU.Build.0 = Release|Any CPU
6680
EndGlobalSection
6781
GlobalSection(SolutionProperties) = preSolution
6882
HideSolutionNode = FALSE
@@ -74,6 +88,8 @@ Global
7488
{F3C9D56A-913A-453D-9C42-B9F467748413} = {58463841-CD45-4229-9E70-A0B74E70ADD7}
7589
{6C94BFE7-2452-42FF-A17A-4E090F2F8DBD} = {58463841-CD45-4229-9E70-A0B74E70ADD7}
7690
{AE3C0606-2210-40ED-AE93-67DBD06461BE} = {40D373E1-A120-41E0-9D3D-1BACC719BB38}
91+
{E8C6F47D-51EE-4488-AF63-2898C01A6515} = {58463841-CD45-4229-9E70-A0B74E70ADD7}
92+
{F03F6A0D-A431-4A8A-9ED3-FF4690051713} = {23793296-3A05-4668-8967-364E6F73EE78}
7793
EndGlobalSection
7894
GlobalSection(ExtensibilityGlobals) = postSolution
7995
SolutionGuid = {BAAC5D9A-83A0-432F-9987-90C49734F761}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
``` ini
2+
3+
BenchmarkDotNet=v0.13.1, OS=Windows 10.0.19044.1706 (21H2)
4+
Intel Core i7-10750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
5+
.NET SDK=6.0.300
6+
[Host] : .NET 5.0.17 (5.0.1722.21314), X64 RyuJIT
7+
DefaultJob : .NET 5.0.17 (5.0.1722.21314), X64 RyuJIT
8+
9+
10+
```
11+
| Method | Mean | Error | StdDev | Rank | Allocated |
12+
|---------------- |---------:|----------:|----------:|-----:|----------:|
13+
| Standard | 1.770 ns | 0.0102 ns | 0.0090 ns | 2 | - |
14+
| PatternMatching | 1.688 ns | 0.0584 ns | 0.0738 ns | 1 | - |
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Rank;Allocated
2+
Standard;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 5.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;1;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;1.770 ns;0.0102 ns;0.0090 ns;2;0 B
3+
PatternMatching;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 5.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;1;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;1.688 ns;0.0584 ns;0.0738 ns;1;0 B
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<!DOCTYPE html>
2+
<html lang='en'>
3+
<head>
4+
<meta charset='utf-8' />
5+
<title>MicroBenchmarks.SwitchStatements-20220517-160420</title>
6+
7+
<style type="text/css">
8+
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
9+
td, th { padding: 6px 13px; border: 1px solid #ddd; text-align: right; }
10+
tr { background-color: #fff; border-top: 1px solid #ccc; }
11+
tr:nth-child(even) { background: #f8f8f8; }
12+
</style>
13+
</head>
14+
<body>
15+
<pre><code>
16+
BenchmarkDotNet=v0.13.1, OS=Windows 10.0.19044.1706 (21H2)
17+
Intel Core i7-10750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
18+
.NET SDK=6.0.300
19+
[Host] : .NET 5.0.17 (5.0.1722.21314), X64 RyuJIT
20+
DefaultJob : .NET 5.0.17 (5.0.1722.21314), X64 RyuJIT
21+
</code></pre>
22+
<pre><code></code></pre>
23+
24+
<table>
25+
<thead><tr><th> Method</th><th>Mean</th><th>Error</th><th>StdDev</th><th>Rank</th><th>Allocated</th>
26+
</tr>
27+
</thead><tbody><tr><td>Standard</td><td>1.770 ns</td><td>0.0102 ns</td><td>0.0090 ns</td><td>2</td><td>-</td>
28+
</tr><tr><td>PatternMatching</td><td>1.688 ns</td><td>0.0584 ns</td><td>0.0738 ns</td><td>1</td><td>-</td>
29+
</tr></tbody></table>
30+
</body>
31+
</html>
Binary file not shown.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using BenchmarkDotNet.Attributes;
2+
using System;
3+
4+
/*
5+
| Method | Mean | Error | StdDev | Rank | Allocated |
6+
|--------------- |------------:|----------:|----------:|-----:|----------:|
7+
| FillWithLoop | 29,797.8 ns | 481.98 ns | 427.27 ns | 2 | - |
8+
| FillWithMethod | 902.8 ns | 17.79 ns | 28.73 ns | 1 | - |
9+
*/
10+
11+
namespace MicroBenchmarks
12+
{
13+
[RankColumn]
14+
[MemoryDiagnoser]
15+
public class BufferFillersBenchmarks
16+
{
17+
private const int size = 65_536;
18+
private readonly byte[] _buffer = new byte[size];
19+
20+
[Benchmark]
21+
public void FillWithLoop()
22+
{
23+
for (int i = 0; i < size; i++)
24+
_buffer[i] = 255;
25+
}
26+
27+
[Benchmark]
28+
public void FillWithMethod()
29+
{
30+
_buffer.AsSpan().Fill(255);
31+
}
32+
}
33+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using ApacheOrcDotNet.OptimizedReader;
2+
using BenchmarkDotNet.Attributes;
3+
using System.IO;
4+
5+
namespace MicroBenchmarks
6+
{
7+
[RankColumn]
8+
[MemoryDiagnoser]
9+
public class BufferReaderBenchmarks
10+
{
11+
private readonly byte[] _readBuffer1 = new byte[3];
12+
private readonly byte[] _readBuffer2 = new byte[3];
13+
private readonly string _testFilePath = @"BenchmarkDotNet.SampleData/optimized_reader_test_file.orc";
14+
private readonly byte[] _testBuffer;
15+
16+
public BufferReaderBenchmarks()
17+
{
18+
using (var fileStream = File.OpenRead(_testFilePath))
19+
{
20+
_testBuffer = new byte[fileStream.Length];
21+
fileStream.Read(_testBuffer);
22+
}
23+
}
24+
25+
[Benchmark]
26+
public void TryRead()
27+
{
28+
var reader = new BufferReader(_testBuffer);
29+
while (reader.TryRead(out _)) { }
30+
}
31+
32+
[Benchmark]
33+
public void TryCopyTo()
34+
{
35+
var reader = new BufferReader(_testBuffer);
36+
while (reader.TryReadTo(_readBuffer1)) { }
37+
}
38+
39+
[Benchmark]
40+
public void TryRead3Bytes()
41+
{
42+
var reader = new BufferReader(_testBuffer);
43+
44+
_ = reader.TryRead(out _);
45+
_ = reader.TryRead(out _);
46+
_ = reader.TryRead(out _);
47+
}
48+
49+
[Benchmark]
50+
public void TryCopyTo3Bytes()
51+
{
52+
var reader = new BufferReader(_testBuffer);
53+
_ = reader.TryReadTo(_readBuffer2);
54+
}
55+
}
56+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using ApacheOrcDotNet.OptimizedReader.Infrastructure;
2+
using BenchmarkDotNet.Attributes;
3+
using System;
4+
using System.Collections.Generic;
5+
6+
/*
7+
| Method | Mean | Error | StdDev | Rank | Allocated |
8+
|------------------------------------ |----------:|----------:|----------:|-----:|----------:|
9+
| ArrayEquality | 7.720 ns | 0.0755 ns | 0.0706 ns | 1 | - |
10+
| DictionaryContainsKeyAndEquality | 12.429 ns | 0.0690 ns | 0.0645 ns | 2 | - |
11+
| DictionaryTryGetValue | 13.052 ns | 0.0677 ns | 0.0633 ns | 3 | - |
12+
*/
13+
14+
namespace MicroBenchmarks
15+
{
16+
[RankColumn]
17+
[MemoryDiagnoser]
18+
public class ComparisonBenchmarks
19+
{
20+
private const int size = 255;
21+
private readonly StreamRange[] _buffer = new StreamRange[size];
22+
private readonly Dictionary<int, StreamRange> _buffer2 = new();
23+
private readonly StreamRange _testRange = new StreamRange(255, 255, 255);
24+
25+
public ComparisonBenchmarks()
26+
{
27+
for (int i = 0; i < size; i++)
28+
{
29+
_buffer[i] = new StreamRange(i, i, i);
30+
_buffer2.Add(i, new StreamRange(i, i, i));
31+
}
32+
}
33+
34+
[Benchmark]
35+
public bool ArrayEquality() => _buffer[128] == _testRange;
36+
37+
[Benchmark]
38+
public bool DictionaryContainsKeyAndEquality() => _buffer2.ContainsKey(128) && _buffer[128] == _testRange;
39+
40+
[Benchmark]
41+
public bool DictionaryTryGetValue() => _buffer2.TryGetValue(128, out var range) && range == _testRange;
42+
}
43+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using BenchmarkDotNet.Attributes;
2+
using System;
3+
4+
namespace MicroBenchmarks
5+
{
6+
[RankColumn]
7+
[MemoryDiagnoser]
8+
public class LoopUnrollBenchmarks
9+
{
10+
[Benchmark]
11+
public void NormalLoop()
12+
{
13+
var numValuesRead = 0;
14+
var numByteValuesRead = 1000;
15+
Span<bool> outputValues = stackalloc bool[numByteValuesRead * 8];
16+
17+
for (int idx = 0; idx < numByteValuesRead; idx++)
18+
{
19+
var decodedByte = 0xff;
20+
21+
for (int bitIdx = 7; bitIdx >= 0; bitIdx--)
22+
{
23+
outputValues[numValuesRead++] = (decodedByte & 1 << bitIdx) != 0;
24+
}
25+
}
26+
}
27+
28+
[Benchmark]
29+
public void UnrolledLoop()
30+
{
31+
var decodedByte = 0xff;
32+
var numValuesRead = 0;
33+
var numByteValuesRead = 1000;
34+
Span<bool> outputValues = stackalloc bool[numByteValuesRead * 8];
35+
36+
for (int idx = 0; idx < numByteValuesRead; idx++)
37+
{
38+
outputValues = outputValues.Slice(8);
39+
if (outputValues.Length < 8)
40+
break;
41+
42+
outputValues[0] = (decodedByte & 128) != 0;
43+
outputValues[1] = (decodedByte & 64) != 0;
44+
outputValues[2] = (decodedByte & 32) != 0;
45+
outputValues[3] = (decodedByte & 16) != 0;
46+
outputValues[4] = (decodedByte & 8) != 0;
47+
outputValues[5] = (decodedByte & 4) != 0;
48+
outputValues[6] = (decodedByte & 2) != 0;
49+
outputValues[7] = (decodedByte & 1) != 0;
50+
51+
numValuesRead += 8;
52+
}
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)