From 906093fa710b34b200206d594c2b70ed884ce082 Mon Sep 17 00:00:00 2001 From: Marc Gravell Date: Thu, 20 Jun 2024 15:53:53 +0100 Subject: [PATCH] benchmark impact of high performance mode --- tests/ConsoleTest/Program.cs | 78 +++++++++++++++++++++++++++++++----- 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/tests/ConsoleTest/Program.cs b/tests/ConsoleTest/Program.cs index 6f37e8a5d..39e00701e 100644 --- a/tests/ConsoleTest/Program.cs +++ b/tests/ConsoleTest/Program.cs @@ -5,14 +5,16 @@ Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); -var options = ConfigurationOptions.Parse("localhost"); +var options = ConfigurationOptions.Parse("127.0.0.1"); #if !SEREDIS_BASELINE options.HighIntegrity = false; // as needed Console.WriteLine($"{nameof(options.HighIntegrity)}: {options.HighIntegrity}"); #endif //options.SocketManager = SocketManager.ThreadPool; +Console.WriteLine("Connecting..."); var connection = ConnectionMultiplexer.Connect(options); +Console.WriteLine("Connected"); connection.ConnectionFailed += Connection_ConnectionFailed; void Connection_ConnectionFailed(object? sender, ConnectionFailedEventArgs e) @@ -23,7 +25,7 @@ void Connection_ConnectionFailed(object? sender, ConnectionFailedEventArgs e) var startTime = DateTime.UtcNow; var startCpuUsage = Process.GetCurrentProcess().TotalProcessorTime; -var scenario = args?.Length > 0 ? args[0] : "mass-insert"; +var scenario = args?.Length > 0 ? args[0] : "mass-insert-async"; switch (scenario) { @@ -35,6 +37,10 @@ void Connection_ConnectionFailed(object? sender, ConnectionFailedEventArgs e) Console.WriteLine("Mass insert test..."); MassInsert(connection); break; + case "mass-insert-async": + Console.WriteLine("Mass insert (async/pipelined) test..."); + await MassInsertAsync(connection); + break; case "mass-publish": Console.WriteLine("Mass publish test..."); MassPublish(connection); @@ -59,7 +65,8 @@ void Connection_ConnectionFailed(object? sender, ConnectionFailedEventArgs e) static void MassInsert(ConnectionMultiplexer connection) { - const int NUM_INSERTIONS = 100000; + const int NUM_INSERTIONS = 100_000; + const int BATCH = 5000; int matchErrors = 0; var database = connection.GetDatabase(0); @@ -72,20 +79,69 @@ static void MassInsert(ConnectionMultiplexer connection) database.StringSet(key, value); var retrievedValue = database.StringGet(key); - if (retrievedValue != value) - { - matchErrors++; - } + if (retrievedValue != value) + { + matchErrors++; + } + + if (i > 0 && i % BATCH == 0) + { + Console.WriteLine(i); + } + } + + Console.WriteLine($"Match errors: {matchErrors}"); +} + +static async Task MassInsertAsync(ConnectionMultiplexer connection) +{ + const int NUM_INSERTIONS = 100_000; + const int BATCH = 5000; + int matchErrors = 0; + + var database = connection.GetDatabase(0); + + var outstanding = new List<(Task, Task, string)>(BATCH); + + for (int i = 0; i < NUM_INSERTIONS; i++) + { + var key = $"StackExchange.Redis.Test.{i}"; + var value = i.ToString(); + + var set = database.StringSetAsync(key, value); + var get = database.StringGetAsync(key); + + outstanding.Add((set, get, value)); + + if (i > 0 && i % BATCH == 0) + { + matchErrors += await ValidateAsync(outstanding); + Console.WriteLine(i); + } - if (i > 0 && i % 5000 == 0) - { - Console.WriteLine(i); - } } + matchErrors += await ValidateAsync(outstanding); Console.WriteLine($"Match errors: {matchErrors}"); + + static async Task ValidateAsync(List<(Task, Task, string)> outstanding) + { + int matchErrors = 0; + foreach (var row in outstanding) + { + var s = await row.Item2; + await row.Item1; + if (s != row.Item3) + { + matchErrors++; + } + } + outstanding.Clear(); + return matchErrors; + } } + static void ParallelTasks(ConnectionMultiplexer connection) { static void ParallelRun(int taskId, ConnectionMultiplexer connection)