Skip to content

Commit 12db5c3

Browse files
committed
Add Benchmarks. Optimized SliceInt64FromBytes
| Method | Mean | Error | StdDev | Ratio | |------------ |----------:|----------:|----------:|------:| | SliceIntNew | 1.197 ns | 0.0496 ns | 0.0464 ns | 0.05 | | SliceIntOld | 23.307 ns | 0.0876 ns | 0.0684 ns | 1.00 |
1 parent a9ab023 commit 12db5c3

File tree

5 files changed

+93
-0
lines changed

5 files changed

+93
-0
lines changed

chiapos-dotnet.sln

+18
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ ProjectSection(SolutionItems) = preProject
1515
README.md = README.md
1616
EndProjectSection
1717
EndProject
18+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chiapos.Dotnet.Benchmarks", "tests\Chiapos.Dotnet.Benchmarks\Chiapos.Dotnet.Benchmarks.csproj", "{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}"
19+
EndProject
1820
Global
1921
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2022
Debug|Any CPU = Debug|Any CPU
@@ -87,6 +89,22 @@ Global
8789
{721CE655-CE03-48AF-8A84-5267AFDBD4A4}.DebugLinux|x64.Build.0 = Debug|x64
8890
{721CE655-CE03-48AF-8A84-5267AFDBD4A4}.ReleaseLinux|x64.ActiveCfg = Release|x64
8991
{721CE655-CE03-48AF-8A84-5267AFDBD4A4}.ReleaseLinux|x64.Build.0 = Release|x64
92+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
93+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
94+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
95+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.Release|Any CPU.Build.0 = Release|Any CPU
96+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.Debug|x64.ActiveCfg = Debug|Any CPU
97+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.Debug|x64.Build.0 = Debug|Any CPU
98+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.Release|x64.ActiveCfg = Release|Any CPU
99+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.Release|x64.Build.0 = Release|Any CPU
100+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.DebugMac|x64.ActiveCfg = Debug|Any CPU
101+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.DebugMac|x64.Build.0 = Debug|Any CPU
102+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
103+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.DebugLinux|x64.Build.0 = Debug|Any CPU
104+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.ReleaseLinux|x64.ActiveCfg = Debug|Any CPU
105+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.ReleaseLinux|x64.Build.0 = Debug|Any CPU
106+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.ReleaseMac|x64.ActiveCfg = Release|x64
107+
{F25FDF1B-5598-4510-92C8-5D5AB6AD73BE}.ReleaseMac|x64.Build.0 = Release|x64
90108
EndGlobalSection
91109
GlobalSection(NestedProjects) = preSolution
92110
{28AD15C3-2D81-4716-96FC-36C4F1046BD4} = {97358EFC-80FB-4FB2-9DE6-4A2BA8112205}

src/Chiapos.Dotnet/Util.cs

+11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
22
using System.Buffers.Binary;
3+
using System.Reflection;
4+
using System.Runtime.CompilerServices;
35
using Dirichlet.Numerics;
46

57
namespace Chiapos.Dotnet
@@ -26,7 +28,16 @@ public static ulong ExtractNum(ReadOnlySpan<byte> buffer, uint len, uint begin_b
2628
// Note: requires that 8 bytes after the first sliced byte are addressable
2729
// (regardless of 'num_bits'). In practice it can be ensured by allocating
2830
// extra 7 bytes to all memory buffers passed to this function.
31+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2932
public static ulong SliceInt64FromBytes(ReadOnlySpan<byte> bytes, uint start_bit, uint num_bits)
33+
{
34+
ulong tmp = BinaryPrimitives.ReadUInt64BigEndian(bytes.Slice((int)start_bit >> 3, 8));
35+
tmp <<= (int)start_bit & ((1 << 3) - 1);
36+
tmp >>= 64 - (int)num_bits;
37+
return tmp;
38+
}
39+
40+
public static ulong SliceInt64FromBytesOld(ReadOnlySpan<byte> bytes, uint start_bit, uint num_bits)
3041
{
3142
ulong tmp;
3243
uint index = 0;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net5.0</TargetFramework>
5+
<Platforms>x64;AnyCPU</Platforms>
6+
<Configurations>Debug;Release;DebugMac;ReleaseMac;DebugLinux;ReleaseLinux</Configurations>
7+
<OutputType>Exe</OutputType>
8+
<ValidateExecutableReferencesMatchSelfContained>false</ValidateExecutableReferencesMatchSelfContained>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
13+
</ItemGroup>
14+
15+
<ItemGroup>
16+
<ProjectReference Include="..\..\src\Chiapos.Dotnet\Chiapos.Dotnet.csproj" />
17+
</ItemGroup>
18+
19+
</Project>
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
using BenchmarkDotNet.Running;
3+
4+
namespace Chiapos.Dotnet.Benchmarks
5+
{
6+
class Program
7+
{
8+
static void Main(string[] args) => BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System;
2+
using BenchmarkDotNet.Attributes;
3+
4+
namespace Chiapos.Dotnet.Benchmarks
5+
{
6+
public class SliceInt64FromBytesBenchmarks
7+
{
8+
private byte[] array;
9+
10+
public SliceInt64FromBytesBenchmarks()
11+
{
12+
array = new byte[10_000_000];
13+
}
14+
15+
[Benchmark]
16+
public void SliceIntNew()
17+
{
18+
var bytes = new ReadOnlySpan<byte>(array);
19+
Util.SliceInt64FromBytes(bytes, 0, 38);
20+
Util.SliceInt64FromBytes(bytes, 38, 42);
21+
Util.SliceInt64FromBytes(bytes, 80, 64);
22+
Util.SliceInt64FromBytes(bytes, 144, 64);
23+
}
24+
25+
[Benchmark(Baseline = true)]
26+
public void SliceIntOld()
27+
{
28+
var bytes = new ReadOnlySpan<byte>(array);
29+
Util.SliceInt64FromBytesOld(bytes, 0, 38);
30+
Util.SliceInt64FromBytesOld(bytes, 38, 42);
31+
Util.SliceInt64FromBytesOld(bytes, 80, 64);
32+
Util.SliceInt64FromBytesOld(bytes, 144, 64);
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)