Commit 6b66c8c5 authored by Marc Gravell's avatar Marc Gravell

moar benchmark types

parent 287dc8f2
using System; using System;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Columns; using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Configs; using BenchmarkDotNet.Configs;
...@@ -21,8 +22,8 @@ internal class CustomConfig : ManualConfig ...@@ -21,8 +22,8 @@ internal class CustomConfig : ManualConfig
public CustomConfig() public CustomConfig()
{ {
Job Get(Job j) => j Job Get(Job j) => j
.With(new GcMode { Force = true }) .With(new GcMode { Force = true });
.With(InProcessToolchain.Instance); //.With(InProcessToolchain.Instance);
Add(new MemoryDiagnoser()); Add(new MemoryDiagnoser());
Add(StatisticColumn.OperationsPerSecond); Add(StatisticColumn.OperationsPerSecond);
...@@ -49,7 +50,12 @@ public RedisBenchmarks() ...@@ -49,7 +50,12 @@ public RedisBenchmarks()
var options = ConfigurationOptions.Parse("127.0.0.1:6379"); var options = ConfigurationOptions.Parse("127.0.0.1:6379");
connection = ConnectionMultiplexer.Connect(options); connection = ConnectionMultiplexer.Connect(options);
db = connection.GetDatabase(3); db = connection.GetDatabase(3);
db.KeyDelete(GeoKey, CommandFlags.FireAndForget);
db.GeoAdd(GeoKey, 13.361389, 38.115556, "Palermo ");
db.GeoAdd(GeoKey, 15.087269, 37.502669, "Catania");
} }
static readonly RedisKey GeoKey = "GeoTest", IncrByKey = "counter";
void IDisposable.Dispose() void IDisposable.Dispose()
{ {
mgr?.Dispose(); mgr?.Dispose();
...@@ -59,31 +65,96 @@ void IDisposable.Dispose() ...@@ -59,31 +65,96 @@ void IDisposable.Dispose()
connection = null; connection = null;
} }
private const int COUNT = 10000; private const int COUNT = 500;
/// <summary>
/// Run INCRBY lots of times
/// </summary>
#if TEST_BASELINE
[Benchmark(Description = "INCRBY:v1/s", OperationsPerInvoke = COUNT)]
#else
[Benchmark(Description = "INCRBY:v2/s", OperationsPerInvoke = COUNT)]
#endif
public int ExecuteIncrBy()
{
var rand = new Random(12345);
db.KeyDelete(IncrByKey, CommandFlags.FireAndForget);
int expected = 0;
for (int i = 0; i < COUNT; i++)
{
int x = rand.Next(50);
expected += x;
db.StringIncrement(IncrByKey, x, CommandFlags.FireAndForget);
}
int actual = (int)db.StringGet(IncrByKey);
if (actual != expected) throw new InvalidOperationException($"expected: {expected}, actual: {actual}");
return actual;
}
/// <summary> /// <summary>
/// Run INCRBY lots of times /// Run INCRBY lots of times
/// </summary> /// </summary>
#if TEST_BASELINE #if TEST_BASELINE
[Benchmark(Description = "INCRBY:v1", OperationsPerInvoke = COUNT)] [Benchmark(Description = "INCRBY:v1/a", OperationsPerInvoke = COUNT)]
#else #else
[Benchmark(Description = "INCRBY:v2", OperationsPerInvoke = COUNT)] [Benchmark(Description = "INCRBY:v2/a", OperationsPerInvoke = COUNT)]
#endif #endif
public int Execute() public async Task<int> ExecuteIncrByAsync()
{ {
var rand = new Random(12345); var rand = new Random(12345);
RedisKey counter = "counter";
db.KeyDelete(counter, CommandFlags.FireAndForget); db.KeyDelete(IncrByKey, CommandFlags.FireAndForget);
int expected = 0; int expected = 0;
for (int i = 0; i < COUNT; i++) for (int i = 0; i < COUNT; i++)
{ {
int x = rand.Next(50); int x = rand.Next(50);
expected += x; expected += x;
db.StringIncrement(counter, x, CommandFlags.FireAndForget); await db.StringIncrementAsync(IncrByKey, x, CommandFlags.FireAndForget);
} }
int actual = (int)db.StringGet(counter); int actual = (int)await db.StringGetAsync(IncrByKey);
if (actual != expected) throw new InvalidOperationException($"expected: {expected}, actual: {actual}"); if (actual != expected) throw new InvalidOperationException($"expected: {expected}, actual: {actual}");
return actual; return actual;
} }
/// <summary>
/// Run GEORADIUS lots of times
/// </summary>
#if TEST_BASELINE
[Benchmark(Description = "GEORADIUS:v1/s", OperationsPerInvoke = COUNT)]
#else
[Benchmark(Description = "GEORADIUS:v2/s", OperationsPerInvoke = COUNT)]
#endif
public int ExecuteGeoRadius()
{
int total = 0;
for (int i = 0; i < COUNT; i++)
{
var results = db.GeoRadius(GeoKey, 15, 37, 200, GeoUnit.Kilometers,
options: GeoRadiusOptions.WithCoordinates | GeoRadiusOptions.WithDistance | GeoRadiusOptions.WithGeoHash);
total += results.Length;
}
return total;
}
/// <summary>
/// Run GEORADIUS lots of times
/// </summary>
#if TEST_BASELINE
[Benchmark(Description = "GEORADIUS:v1/a", OperationsPerInvoke = COUNT)]
#else
[Benchmark(Description = "GEORADIUS:v2/a", OperationsPerInvoke = COUNT)]
#endif
public async Task<int> ExecuteGeoRadiusAsync()
{
int total = 0;
for (int i = 0; i < COUNT; i++)
{
var results = await db.GeoRadiusAsync(GeoKey, 15, 37, 200, GeoUnit.Kilometers,
options: GeoRadiusOptions.WithCoordinates | GeoRadiusOptions.WithDistance | GeoRadiusOptions.WithGeoHash);
total += results.Length;
}
return total;
}
} }
} }
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
<PropertyGroup> <PropertyGroup>
<Description>StackExchange.Redis.BasicTest .NET Core</Description> <Description>StackExchange.Redis.BasicTest .NET Core</Description>
<TargetFrameworks>netcoreapp2.0;netcoreapp2.1;net47</TargetFrameworks> <TargetFrameworks>netcoreapp2.0;netcoreapp2.1;net47</TargetFrameworks>
<AssemblyName>BasicTest</AssemblyName> <AssemblyName>BasicTestBaseline</AssemblyName>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<PackageId>BasicTest</PackageId> <PackageId>BasicTestBaseline</PackageId>
<RuntimeIdentifiers>win7-x64</RuntimeIdentifiers> <RuntimeIdentifiers>win7-x64</RuntimeIdentifiers>
<GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute> <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
......
...@@ -12,7 +12,7 @@ private static int Main() ...@@ -12,7 +12,7 @@ private static int Main()
using (var obj = new BasicTest.RedisBenchmarks()) using (var obj = new BasicTest.RedisBenchmarks())
{ {
var watch = Stopwatch.StartNew(); var watch = Stopwatch.StartNew();
obj.Execute(); obj.ExecuteIncrBy();
watch.Stop(); watch.Stop();
Console.WriteLine($"{watch.ElapsedMilliseconds}ms"); Console.WriteLine($"{watch.ElapsedMilliseconds}ms");
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment