Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added BDN for all hash commands #879

Merged
merged 4 commits into from
Dec 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci-bdnbenchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
os: [ ubuntu-latest, windows-latest ]
framework: [ 'net8.0' ]
configuration: [ 'Release' ]
test: [ 'Operations.BasicOperations', 'Operations.ObjectOperations', 'Cluster.ClusterMigrate', 'Cluster.ClusterOperations', 'Lua.LuaScripts' ]
test: [ 'Operations.BasicOperations', 'Operations.ObjectOperations', 'Operations.HashObjectOperations', 'Cluster.ClusterMigrate', 'Cluster.ClusterOperations', 'Lua.LuaScripts' ]
steps:
- name: Check out code
uses: actions/checkout@v4
Expand Down
189 changes: 189 additions & 0 deletions benchmark/BDN.benchmark/Operations/HashObjectOperations.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

using BenchmarkDotNet.Attributes;

namespace BDN.benchmark.Operations
{
/// <summary>
/// Benchmark for HashObjectOperations
/// </summary>
[MemoryDiagnoser]
public unsafe class HashObjectOperations : OperationsBase
{
static ReadOnlySpan<byte> HSETDEL => "*4\r\n$4\r\nHSET\r\n$1\r\nf\r\n$1\r\na\r\n$1\r\na\r\n*3\r\n$4\r\nHDEL\r\n$1\r\nf\r\n$1\r\na\r\n"u8;
byte[] hSetDelRequestBuffer;
byte* hSetDelRequestBufferPointer;

static ReadOnlySpan<byte> HEXISTS => "*3\r\n$7\r\nHEXISTS\r\n$1\r\nf\r\n$1\r\na\r\n"u8;
byte[] hExistsRequestBuffer;
byte* hExistsRequestBufferPointer;

static ReadOnlySpan<byte> HGET => "*3\r\n$4\r\nHGET\r\n$1\r\nf\r\n$1\r\na\r\n"u8;
byte[] hGetRequestBuffer;
byte* hGetRequestBufferPointer;

static ReadOnlySpan<byte> HGETALL => "*2\r\n$7\r\nHGETALL\r\n$1\r\nf\r\n"u8;
byte[] hGetAllRequestBuffer;
byte* hGetAllRequestBufferPointer;

static ReadOnlySpan<byte> HINCRBY => "*4\r\n$7\r\nHINCRBY\r\n$1\r\nf\r\n$1\r\nc\r\n$1\r\n1\r\n"u8;
byte[] hIncrbyRequestBuffer;
byte* hIncrbyRequestBufferPointer;

static ReadOnlySpan<byte> HINCRBYFLOAT => "*4\r\n$12\r\nHINCRBYFLOAT\r\n$1\r\nf\r\n$1\r\nd\r\n$3\r\n1.5\r\n"u8;
byte[] hIncrbyFloatRequestBuffer;
byte* hIncrbyFloatRequestBufferPointer;

static ReadOnlySpan<byte> HKEYS => "*2\r\n$5\r\nHKEYS\r\n$1\r\nf\r\n"u8;
byte[] hKeysRequestBuffer;
byte* hKeysRequestBufferPointer;

static ReadOnlySpan<byte> HLEN => "*2\r\n$4\r\nHLEN\r\n$1\r\nf\r\n"u8;
byte[] hLenRequestBuffer;
byte* hLenRequestBufferPointer;

static ReadOnlySpan<byte> HMGET => "*4\r\n$5\r\nHMGET\r\n$1\r\nf\r\n$1\r\na\r\n$1\r\nb\r\n"u8;
byte[] hMGetRequestBuffer;
byte* hMGetRequestBufferPointer;

static ReadOnlySpan<byte> HMSET => "*6\r\n$5\r\nHMSET\r\n$1\r\nf\r\n$1\r\na\r\n$1\r\n1\r\n$1\r\nb\r\n$1\r\n2\r\n"u8;
byte[] hMSetRequestBuffer;
byte* hMSetRequestBufferPointer;

static ReadOnlySpan<byte> HRANDFIELD => "*2\r\n$10\r\nHRANDFIELD\r\n$1\r\nf\r\n"u8;
byte[] hRandFieldRequestBuffer;
byte* hRandFieldRequestBufferPointer;

static ReadOnlySpan<byte> HSCAN => "*6\r\n$5\r\nHSCAN\r\n$1\r\nf\r\n$1\r\n0\r\n$5\r\nCOUNT\r\n$1\r\n5\r\n"u8;
byte[] hScanRequestBuffer;
byte* hScanRequestBufferPointer;

static ReadOnlySpan<byte> HSETNX => "*4\r\n$6\r\nHSETNX\r\n$1\r\nf\r\n$1\r\nx\r\n$1\r\n1\r\n"u8;
byte[] hSetNxRequestBuffer;
byte* hSetNxRequestBufferPointer;

static ReadOnlySpan<byte> HSTRLEN => "*3\r\n$7\r\nHSTRLEN\r\n$1\r\nf\r\n$1\r\na\r\n"u8;
byte[] hStrLenRequestBuffer;
byte* hStrLenRequestBufferPointer;

static ReadOnlySpan<byte> HVALS => "*2\r\n$5\r\nHVALS\r\n$1\r\nf\r\n"u8;
byte[] hValsRequestBuffer;
byte* hValsRequestBufferPointer;

public override void GlobalSetup()
{
base.GlobalSetup();
SetupOperation(ref hSetDelRequestBuffer, ref hSetDelRequestBufferPointer, HSETDEL);
SetupOperation(ref hExistsRequestBuffer, ref hExistsRequestBufferPointer, HEXISTS);
SetupOperation(ref hGetRequestBuffer, ref hGetRequestBufferPointer, HGET);
SetupOperation(ref hGetAllRequestBuffer, ref hGetAllRequestBufferPointer, HGETALL);
SetupOperation(ref hIncrbyRequestBuffer, ref hIncrbyRequestBufferPointer, HINCRBY);
SetupOperation(ref hIncrbyFloatRequestBuffer, ref hIncrbyFloatRequestBufferPointer, HINCRBYFLOAT);
SetupOperation(ref hKeysRequestBuffer, ref hKeysRequestBufferPointer, HKEYS);
SetupOperation(ref hLenRequestBuffer, ref hLenRequestBufferPointer, HLEN);
SetupOperation(ref hMGetRequestBuffer, ref hMGetRequestBufferPointer, HMGET);
SetupOperation(ref hMSetRequestBuffer, ref hMSetRequestBufferPointer, HMSET);
SetupOperation(ref hRandFieldRequestBuffer, ref hRandFieldRequestBufferPointer, HRANDFIELD);
SetupOperation(ref hScanRequestBuffer, ref hScanRequestBufferPointer, HSCAN);
SetupOperation(ref hSetNxRequestBuffer, ref hSetNxRequestBufferPointer, HSETNX);
SetupOperation(ref hStrLenRequestBuffer, ref hStrLenRequestBufferPointer, HSTRLEN);
SetupOperation(ref hValsRequestBuffer, ref hValsRequestBufferPointer, HVALS);

// Pre-populate data
SlowConsumeMessage("*3\r\n$4\r\nHSET\r\n$1\r\nf\r\n$1\r\nb\r\n$1\r\nb\r\n"u8);
SlowConsumeMessage("*4\r\n$4\r\nHSET\r\n$1\r\nf\r\n$1\r\nc\r\n$1\r\n5\r\n"u8);
SlowConsumeMessage("*4\r\n$4\r\nHSET\r\n$1\r\nf\r\n$1\r\nd\r\n$3\r\n5.5\r\n"u8);
}

[Benchmark]
public void HSetDel()
{
_ = session.TryConsumeMessages(hSetDelRequestBufferPointer, hSetDelRequestBuffer.Length);
}

[Benchmark]
public void HExists()
{
_ = session.TryConsumeMessages(hExistsRequestBufferPointer, hExistsRequestBuffer.Length);
}

[Benchmark]
public void HGet()
{
_ = session.TryConsumeMessages(hGetRequestBufferPointer, hGetRequestBuffer.Length);
}

[Benchmark]
public void HGetAll()
{
_ = session.TryConsumeMessages(hGetAllRequestBufferPointer, hGetAllRequestBuffer.Length);
}

[Benchmark]
public void HIncrby()
{
_ = session.TryConsumeMessages(hIncrbyRequestBufferPointer, hIncrbyRequestBuffer.Length);
}

[Benchmark]
public void HIncrbyFloat()
{
_ = session.TryConsumeMessages(hIncrbyFloatRequestBufferPointer, hIncrbyFloatRequestBuffer.Length);
}

[Benchmark]
public void HKeys()
{
_ = session.TryConsumeMessages(hKeysRequestBufferPointer, hKeysRequestBuffer.Length);
}

[Benchmark]
public void HLen()
{
_ = session.TryConsumeMessages(hLenRequestBufferPointer, hLenRequestBuffer.Length);
}

[Benchmark]
public void HMGet()
{
_ = session.TryConsumeMessages(hMGetRequestBufferPointer, hMGetRequestBuffer.Length);
}

[Benchmark]
public void HMSet()
{
_ = session.TryConsumeMessages(hMSetRequestBufferPointer, hMSetRequestBuffer.Length);
}

[Benchmark]
public void HRandField()
{
_ = session.TryConsumeMessages(hRandFieldRequestBufferPointer, hRandFieldRequestBuffer.Length);
}

[Benchmark]
public void HScan()
{
_ = session.TryConsumeMessages(hScanRequestBufferPointer, hScanRequestBuffer.Length);
}

[Benchmark]
public void HSetNx()
{
_ = session.TryConsumeMessages(hSetNxRequestBufferPointer, hSetNxRequestBuffer.Length);
}

[Benchmark]
public void HStrLen()
{
_ = session.TryConsumeMessages(hStrLenRequestBufferPointer, hStrLenRequestBuffer.Length);
}

[Benchmark]
public void HVals()
{
_ = session.TryConsumeMessages(hValsRequestBufferPointer, hValsRequestBuffer.Length);
}
}
}
12 changes: 0 additions & 12 deletions benchmark/BDN.benchmark/Operations/ObjectOperations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,17 @@ public unsafe class ObjectOperations : OperationsBase
byte[] sAddRemRequestBuffer;
byte* sAddRemRequestBufferPointer;

static ReadOnlySpan<byte> HSETDEL => "*4\r\n$4\r\nHSET\r\n$1\r\nf\r\n$1\r\na\r\n$1\r\na\r\n*3\r\n$4\r\nHDEL\r\n$1\r\nf\r\n$1\r\na\r\n"u8;
byte[] hSetDelRequestBuffer;
byte* hSetDelRequestBufferPointer;

public override void GlobalSetup()
{
base.GlobalSetup();
SetupOperation(ref zAddRemRequestBuffer, ref zAddRemRequestBufferPointer, ZADDREM);
SetupOperation(ref lPushPopRequestBuffer, ref lPushPopRequestBufferPointer, LPUSHPOP);
SetupOperation(ref sAddRemRequestBuffer, ref sAddRemRequestBufferPointer, SADDREM);
SetupOperation(ref hSetDelRequestBuffer, ref hSetDelRequestBufferPointer, HSETDEL);

// Pre-populate data
SlowConsumeMessage("*4\r\n$4\r\nZADD\r\n$1\r\nc\r\n$1\r\n1\r\n$1\r\nd\r\n"u8);
SlowConsumeMessage("*3\r\n$5\r\nLPUSH\r\n$1\r\nd\r\n$1\r\nf\r\n"u8);
SlowConsumeMessage("*3\r\n$4\r\nSADD\r\n$1\r\ne\r\n$1\r\nb\r\n"u8);
SlowConsumeMessage("*3\r\n$4\r\nHSET\r\n$1\r\nf\r\n$1\r\nb\r\n$1\r\nb\r\n"u8);
}

[Benchmark]
Expand All @@ -59,11 +53,5 @@ public void SAddRem()
{
_ = session.TryConsumeMessages(sAddRemRequestBufferPointer, sAddRemRequestBuffer.Length);
}

[Benchmark]
public void HSetDel()
{
_ = session.TryConsumeMessages(hSetDelRequestBufferPointer, hSetDelRequestBuffer.Length);
}
}
}
8 changes: 5 additions & 3 deletions test/BDNPerfTests/BDN_Benchmark_Config.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,16 @@
"expected_ZAddRem_ACL": 17.97,
"expected_LPushPop_ACL": 14.06,
"expected_SAddRem_ACL": 12.5,
"expected_HSetDel_ACL": 42.19,
"expected_ZAddRem_AOF": 17.97,
"expected_LPushPop_AOF": 14.06,
"expected_SAddRem_AOF": 12.5,
"expected_HSetDel_AOF": 42.19,
"expected_ZAddRem_None": 17.97,
"expected_LPushPop_None": 14.06,
"expected_SAddRem_None": 12.5,
"expected_SAddRem_None": 12.5
},
"BDN.benchmark.Operations.HashObjectOperations.*": {
"expected_HSetDel_ACL": 42.19,
"expected_HSetDel_AOF": 42.19,
"expected_HSetDel_None": 42.19
},
"BDN.benchmark.Cluster.ClusterOperations.*": {
Expand Down
Loading