blob: 43f816bb1c6eb146f67ff15fb919ab6a49a93f53 [file] [log] [blame]
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001#region Copyright notice and license
2
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003// Copyright 2015 gRPC authors.
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08004//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08008//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009// http://www.apache.org/licenses/LICENSE-2.0
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080010//
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080016
17#endregion
18
19using System;
20using System.Diagnostics;
Jan Tattermusch075dde42015-03-11 18:21:00 -070021using System.Runtime.InteropServices;
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080022using System.Threading;
23using System.Threading.Tasks;
24using Grpc.Core;
25using Grpc.Core.Internal;
26using Grpc.Core.Utils;
27using NUnit.Framework;
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080028
29namespace Grpc.Core.Tests
30{
31 public class PInvokeTest
32 {
Jan Tattermuschafab5412016-01-12 17:57:25 -080033 static readonly NativeMethods Native = NativeMethods.Get();
34
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080035 int counter;
36
Jan Tattermusch5b141662015-02-23 20:28:30 -080037 /// <summary>
38 /// (~1.26us .NET Windows)
39 /// </summary>
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080040 [Test]
Jan Tattermuschb7462942017-03-08 19:30:21 +010041 public void CompletionQueueCreateSyncDestroyBenchmark()
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080042 {
Jan Tattermusch1b8210f2015-12-14 13:26:17 -080043 GrpcEnvironment.AddRef(); // completion queue requires gRPC environment being initialized.
44
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080045 BenchmarkUtil.RunBenchmark(
murgatroid995561de22015-10-07 16:52:09 -070046 10, 10,
Jan Tattermusch075dde42015-03-11 18:21:00 -070047 () =>
48 {
Jan Tattermuschb7462942017-03-08 19:30:21 +010049 CompletionQueueSafeHandle cq = CompletionQueueSafeHandle.CreateSync();
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080050 cq.Dispose();
Jan Tattermusch075dde42015-03-11 18:21:00 -070051 });
Jan Tattermusch1b8210f2015-12-14 13:26:17 -080052
Jan Tattermusch58584412016-05-31 14:32:27 -070053 GrpcEnvironment.ReleaseAsync().Wait();
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080054 }
55
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080056 /// <summary>
57 /// Approximate results:
Jan Tattermusch5b141662015-02-23 20:28:30 -080058 /// (~80ns Mono Linux)
59 /// (~110ns .NET Windows)
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080060 /// </summary>
61 [Test]
Jan Tattermuschdb45aa82016-04-01 16:13:02 -070062 [Category("Performance")]
63 [Ignore("Prevent running on Jenkins")]
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080064 public void NativeCallbackBenchmark()
65 {
Jan Tattermusch9a244d62017-11-17 20:02:31 +010066 NativeCallbackTestDelegate handler = Handler;
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080067
68 counter = 0;
69 BenchmarkUtil.RunBenchmark(
70 1000000, 10000000,
Jan Tattermusch075dde42015-03-11 18:21:00 -070071 () =>
72 {
Jan Tattermuschafab5412016-01-12 17:57:25 -080073 Native.grpcsharp_test_callback(handler);
Jan Tattermusch075dde42015-03-11 18:21:00 -070074 });
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080075 Assert.AreNotEqual(0, counter);
76 }
77
78 /// <summary>
79 /// Creating a new native-to-managed callback has significant overhead
80 /// compared to using an existing one. We need to be aware of this.
Jan Tattermusch5b141662015-02-23 20:28:30 -080081 /// (~50us on Mono Linux!!!)
82 /// (~1.1us on .NET Windows)
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080083 /// </summary>
84 [Test]
Jan Tattermuschdb45aa82016-04-01 16:13:02 -070085 [Category("Performance")]
86 [Ignore("Prevent running on Jenkins")]
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080087 public void NewNativeCallbackBenchmark()
88 {
89 counter = 0;
90 BenchmarkUtil.RunBenchmark(
91 10000, 10000,
Jan Tattermusch075dde42015-03-11 18:21:00 -070092 () =>
93 {
Jan Tattermusch9a244d62017-11-17 20:02:31 +010094 Native.grpcsharp_test_callback(new NativeCallbackTestDelegate(Handler));
Jan Tattermusch075dde42015-03-11 18:21:00 -070095 });
Jan Tattermusch50faa8f2015-02-21 17:51:52 -080096 Assert.AreNotEqual(0, counter);
97 }
98
99 /// <summary>
100 /// Tests overhead of a simple PInvoke call.
Jan Tattermusch5b141662015-02-23 20:28:30 -0800101 /// (~46ns .NET Windows)
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800102 /// </summary>
103 [Test]
Jan Tattermuschdb45aa82016-04-01 16:13:02 -0700104 [Category("Performance")]
105 [Ignore("Prevent running on Jenkins")]
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800106 public void NopPInvokeBenchmark()
107 {
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800108 BenchmarkUtil.RunBenchmark(
109 1000000, 100000000,
Jan Tattermusch075dde42015-03-11 18:21:00 -0700110 () =>
111 {
Jan Tattermuschafab5412016-01-12 17:57:25 -0800112 Native.grpcsharp_test_nop(IntPtr.Zero);
Jan Tattermusch075dde42015-03-11 18:21:00 -0700113 });
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800114 }
115
Jan Tattermuschd3677482015-06-01 19:27:40 -0700116 private void Handler(bool success)
Jan Tattermusch075dde42015-03-11 18:21:00 -0700117 {
118 counter++;
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800119 }
120 }
121}