diff --git a/progaudi.tarantool.sln b/progaudi.tarantool.sln index 887fd550..f5bf9ae9 100644 --- a/progaudi.tarantool.sln +++ b/progaudi.tarantool.sln @@ -1,12 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26228.9 +VisualStudioVersion = 15.0.26430.12 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "progaudi.tarantool", "src\progaudi.tarantool\progaudi.tarantool.csproj", "{DD007E9F-FB2D-4351-AAB7-F2D367B295C4}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "progaudi.tarantool.tests", "tests\progaudi.tarantool.tests\progaudi.tarantool.tests.csproj", "{4C681801-9A6B-4CE9-8EAA-23F80917F046}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "progaudi.benchmark.async-await", "src\progaudi.benchmark.async-await\progaudi.benchmark.async-await.csproj", "{5EA5C959-4A4F-4186-A2DC-F6028EF056C0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,6 +43,18 @@ Global {4C681801-9A6B-4CE9-8EAA-23F80917F046}.Release|x64.Build.0 = Release|Any CPU {4C681801-9A6B-4CE9-8EAA-23F80917F046}.Release|x86.ActiveCfg = Release|Any CPU {4C681801-9A6B-4CE9-8EAA-23F80917F046}.Release|x86.Build.0 = Release|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Debug|x64.ActiveCfg = Debug|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Debug|x64.Build.0 = Debug|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Debug|x86.ActiveCfg = Debug|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Debug|x86.Build.0 = Debug|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Release|Any CPU.Build.0 = Release|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Release|x64.ActiveCfg = Release|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Release|x64.Build.0 = Release|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Release|x86.ActiveCfg = Release|Any CPU + {5EA5C959-4A4F-4186-A2DC-F6028EF056C0}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/progaudi.benchmark.async-await/Benchmark.cs b/src/progaudi.benchmark.async-await/Benchmark.cs new file mode 100644 index 00000000..2dc23094 --- /dev/null +++ b/src/progaudi.benchmark.async-await/Benchmark.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Attributes.Jobs; +using ProGaudi.Tarantool.Client; +using ProGaudi.Tarantool.Client.Model.Responses; + +namespace ProGaudi.Tarantool.Benchmark.Async_Await +{ + [CoreJob] + public class Benchmark + { + private readonly Box _box; + + public Benchmark() + { + this._box = Box.Connect("localhost", 3301).GetAwaiter().GetResult(); + } + + [Benchmark] + public async Task> Call() => await _box.Call("test_for_benchmarking"); + } +} diff --git a/src/progaudi.benchmark.async-await/BenchmarkDotNet.Artifacts/results/Benchmark-report-github.md b/src/progaudi.benchmark.async-await/BenchmarkDotNet.Artifacts/results/Benchmark-report-github.md new file mode 100644 index 00000000..15dcd5db --- /dev/null +++ b/src/progaudi.benchmark.async-await/BenchmarkDotNet.Artifacts/results/Benchmark-report-github.md @@ -0,0 +1,15 @@ +``` ini + +BenchmarkDotNet=v0.10.7, OS=Windows 10 Redstone 2 (10.0.15063) +Processor=Intel Core i5-4590 CPU 3.30GHz (Haswell), ProcessorCount=4 +Frequency=3215209 Hz, Resolution=311.0218 ns, Timer=TSC +dotnet cli version=1.0.0 + [Host] : .NET Core 4.6.25211.01, 64bit RyuJIT + Core : .NET Core 4.6.25211.01, 64bit RyuJIT + +Job=Core Runtime=Core + +``` + | Method | Mean | Error | StdDev | + |------- |---------:|---------:|---------:| + | Call | 448.1 us | 16.68 us | 47.86 us | diff --git a/src/progaudi.benchmark.async-await/BenchmarkDotNet.Artifacts/results/Benchmark-report.csv b/src/progaudi.benchmark.async-await/BenchmarkDotNet.Artifacts/results/Benchmark-report.csv new file mode 100644 index 00000000..c95ffdcc --- /dev/null +++ b/src/progaudi.benchmark.async-await/BenchmarkDotNet.Artifacts/results/Benchmark-report.csv @@ -0,0 +1,2 @@ +Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;RemoveOutliers;Affinity;Jit;Platform;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;RetainVm;Server;Clock;EngineFactory;Toolchain;InvocationCount;IterationTime;LaunchCount;RunStrategy;TargetCount;UnrollFactor;WarmupCount;Mean;Error;StdDev +Call;Core;False;Default;Default;Default;Default;Default;Default;15;RyuJit;X64;Core;False;True;False;True;False;False;Default;Default;Default;1;Default;Default;Default;Default;16;Default;448.1 us;16.68 us;47.86 us diff --git a/src/progaudi.benchmark.async-await/BenchmarkDotNet.Artifacts/results/Benchmark-report.html b/src/progaudi.benchmark.async-await/BenchmarkDotNet.Artifacts/results/Benchmark-report.html new file mode 100644 index 00000000..2dcce5a3 --- /dev/null +++ b/src/progaudi.benchmark.async-await/BenchmarkDotNet.Artifacts/results/Benchmark-report.html @@ -0,0 +1,32 @@ + + + + +Benchmark + + + + +

+BenchmarkDotNet=v0.10.7, OS=Windows 10 Redstone 2 (10.0.15063)
+Processor=Intel Core i5-4590 CPU 3.30GHz (Haswell), ProcessorCount=4
+Frequency=3215209 Hz, Resolution=311.0218 ns, Timer=TSC
+dotnet cli version=1.0.0
+  [Host] : .NET Core 4.6.25211.01, 64bit RyuJIT
+  Core   : .NET Core 4.6.25211.01, 64bit RyuJIT
+
+
Job=Core  Runtime=Core  
+
+ + + + + +
MethodMeanErrorStdDev
Call448.1 us16.68 us47.86 us
+ + diff --git a/src/progaudi.benchmark.async-await/Program.cs b/src/progaudi.benchmark.async-await/Program.cs new file mode 100644 index 00000000..5f32c882 --- /dev/null +++ b/src/progaudi.benchmark.async-await/Program.cs @@ -0,0 +1,9 @@ +using BenchmarkDotNet.Running; + +namespace ProGaudi.Tarantool.Benchmark.Async_Await +{ + public static class Program + { + public static void Main() => BenchmarkRunner.Run(); + } +} \ No newline at end of file diff --git a/src/progaudi.benchmark.async-await/progaudi.benchmark.async-await.csproj b/src/progaudi.benchmark.async-await/progaudi.benchmark.async-await.csproj new file mode 100644 index 00000000..1ad13b87 --- /dev/null +++ b/src/progaudi.benchmark.async-await/progaudi.benchmark.async-await.csproj @@ -0,0 +1,17 @@ + + + + Exe + netcoreapp1.1 + ProGaudi.Tarantool.Benchmark.Async_Await + + + + + + + + + + + \ No newline at end of file diff --git a/src/progaudi.tarantool/Box.cs b/src/progaudi.tarantool/Box.cs index bbbda29f..4d98a2e7 100644 --- a/src/progaudi.tarantool/Box.cs +++ b/src/progaudi.tarantool/Box.cs @@ -21,9 +21,9 @@ public Box(ClientOptions options) Metrics = new Metrics(_logicalConnection); } - public async Task Connect() + public Task Connect() { - await _logicalConnection.Connect(); + return _logicalConnection.Connect(); } public static async Task Connect(string replicationSource) @@ -38,13 +38,7 @@ public Metrics Metrics get; } - public bool IsConnected - { - get - { - return _logicalConnection.IsConnected(); - } - } + public bool IsConnected => _logicalConnection.IsConnected(); public static Task Connect(string host, int port) { @@ -69,15 +63,15 @@ public ISchema GetSchema() return new Schema(_logicalConnection); } - public async Task Call_1_6(string functionName) + public Task Call_1_6(string functionName) { - await Call_1_6(functionName, TarantoolTuple.Empty); + return Call_1_6(functionName, TarantoolTuple.Empty); } - public async Task Call_1_6(string functionName, TTuple parameters) + public Task Call_1_6(string functionName, TTuple parameters) where TTuple : ITarantoolTuple { - await Call_1_6(functionName, parameters); + return Call_1_6(functionName, parameters); } public Task> Call_1_6(string functionName) @@ -86,23 +80,23 @@ public Task> Call_1_6(string functionName) return Call_1_6(functionName, TarantoolTuple.Empty); } - public async Task> Call_1_6(string functionName, TTuple parameters) + public Task> Call_1_6(string functionName, TTuple parameters) where TTuple : ITarantoolTuple where TResponse : ITarantoolTuple { var callRequest = new CallRequest(functionName, parameters, false); - return await _logicalConnection.SendRequest, TResponse>(callRequest); + return _logicalConnection.SendRequest, TResponse>(callRequest); } - public async Task Call(string functionName) + public Task Call(string functionName) { - await Call(functionName, TarantoolTuple.Empty); + return Call(functionName, TarantoolTuple.Empty); } - public async Task Call(string functionName, TTuple parameters) + public Task Call(string functionName, TTuple parameters) where TTuple : ITarantoolTuple { - await Call(functionName, parameters); + return Call(functionName, parameters); } public Task> Call(string functionName) @@ -110,18 +104,18 @@ public Task> Call(string functionName) return Call(functionName, TarantoolTuple.Empty); } - public async Task> Call(string functionName, TTuple parameters) + public Task> Call(string functionName, TTuple parameters) where TTuple : ITarantoolTuple { var callRequest = new CallRequest(functionName, parameters); - return await _logicalConnection.SendRequest, TResponse>(callRequest); + return _logicalConnection.SendRequest, TResponse>(callRequest); } - public async Task> Eval(string expression, TTuple parameters) + public Task> Eval(string expression, TTuple parameters) where TTuple : ITarantoolTuple { var evalRequest = new EvalRequest(expression, parameters); - return await _logicalConnection.SendRequest, TResponse>(evalRequest); + return _logicalConnection.SendRequest, TResponse>(evalRequest); } public Task> Eval(string expression) diff --git a/src/progaudi.tarantool/Index.cs b/src/progaudi.tarantool/Index.cs index 4f7243ff..88305bc1 100644 --- a/src/progaudi.tarantool/Index.cs +++ b/src/progaudi.tarantool/Index.cs @@ -44,7 +44,7 @@ public Task> Pairs(TValue value, Iterator throw new NotImplementedException(); } - public async Task> Select(TKey key, SelectOptions options = null) + public Task> Select(TKey key, SelectOptions options = null) where TKey : ITarantoolTuple where TTuple : ITarantoolTuple { @@ -56,33 +56,33 @@ public async Task> Select(TKey key, SelectO options?.Iterator ?? Iterator.Eq, key); - return await LogicalConnection.SendRequest, TTuple>(selectRequest); + return LogicalConnection.SendRequest, TTuple>(selectRequest); } ///Note: there is no such method in specification http://tarantool.org/doc/book/box/box_index.html. ///But common sense, and sources https://github.com/tarantool/tarantool/blob/1.7/src/box/lua/index.c says that that method sould be - public async Task> Insert(TTuple tuple) + public Task> Insert(TTuple tuple) where TTuple : ITarantoolTuple { var insertRequest = new InsertRequest(SpaceId, tuple); - return await LogicalConnection.SendRequest, TTuple>(insertRequest); + return LogicalConnection.SendRequest, TTuple>(insertRequest); } ///Note: there is no such method in specification http://tarantool.org/doc/book/box/box_index.html. ///But common sense, and sources https://github.com/tarantool/tarantool/blob/1.7/src/box/lua/index.c says that that method sould be - public async Task> Replace(TTuple tuple) + public Task> Replace(TTuple tuple) where TTuple : ITarantoolTuple { var replaceRequest = new ReplaceRequest(SpaceId, tuple); - return await LogicalConnection.SendRequest, TTuple>(replaceRequest); + return LogicalConnection.SendRequest, TTuple>(replaceRequest); } - public async Task Min() + public Task Min() where TTuple : ITarantoolTuple { - return await Min(TarantoolTuple.Empty); + return Min(TarantoolTuple.Empty); } public async Task Min(TKey key) @@ -101,10 +101,10 @@ public async Task Min(TKey key) return minResponse.Data.SingleOrDefault(); } - public async Task Max() + public Task Max() where TTuple : ITarantoolTuple { - return await Max(TarantoolTuple.Empty); + return Max(TarantoolTuple.Empty); } public async Task Max(TKey key = null) @@ -135,7 +135,7 @@ public uint Count(TKey key = null, Iterator it = Iterator.Eq) throw new NotImplementedException(); } - public async Task> Update(TKey key, UpdateOperation[] updateOperations) + public Task> Update(TKey key, UpdateOperation[] updateOperations) where TKey : ITarantoolTuple where TTuple : ITarantoolTuple { @@ -145,10 +145,10 @@ public async Task> Update(TKey key, UpdateO key, updateOperations); - return await LogicalConnection.SendRequest, TTuple>(updateRequest); + return LogicalConnection.SendRequest, TTuple>(updateRequest); } - public async Task Upsert(TKey key, UpdateOperation[] updateOperations) + public Task Upsert(TKey key, UpdateOperation[] updateOperations) where TKey : ITarantoolTuple { var updateRequest = new UpsertRequest( @@ -156,16 +156,16 @@ public async Task Upsert(TKey key, UpdateOperation[] updateOperations) key, updateOperations); - await LogicalConnection.SendRequestWithEmptyResponse(updateRequest); + return LogicalConnection.SendRequestWithEmptyResponse(updateRequest); } - public async Task> Delete(TKey key) + public Task> Delete(TKey key) where TKey : ITarantoolTuple where TTuple : ITarantoolTuple { var deleteRequest = new DeleteRequest(SpaceId, Id, key); - return await LogicalConnection.SendRequest, TTuple>(deleteRequest); + return LogicalConnection.SendRequest, TTuple>(deleteRequest); } public Task Alter(IndexCreationOptions options) diff --git a/src/progaudi.tarantool/LogicalConnection.cs b/src/progaudi.tarantool/LogicalConnection.cs index 47badb69..ce204884 100644 --- a/src/progaudi.tarantool/LogicalConnection.cs +++ b/src/progaudi.tarantool/LogicalConnection.cs @@ -123,10 +123,10 @@ public async Task SendRequestWithEmptyResponse(TRequest request, TimeS await SendRequestImpl(request, timeout); } - public async Task> SendRequest(TRequest request, TimeSpan? timeout = null) + public Task> SendRequest(TRequest request, TimeSpan? timeout = null) where TRequest : IRequest { - return await SendRequestImpl>(request, timeout); + return SendRequestImpl>(request, timeout); } public static byte[] ReadFully(Stream input) diff --git a/tarantool/testdata.lua b/tarantool/testdata.lua index 01d2c876..ea037f43 100644 --- a/tarantool/testdata.lua +++ b/tarantool/testdata.lua @@ -110,4 +110,10 @@ function clear_data(spaceNames) for _, spaceName in ipairs(spaceNames) do truncate_space(spaceName) end +end + +local test_int = 0 +function test_for_benchmarking() + test_int = test_int + 1 + return test_int end \ No newline at end of file