#region Copyright notice and license // Copyright 2015 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #endregion using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using Grpc.Core; using Grpc.Core.Internal; using Grpc.Core.Utils; using NUnit.Framework; namespace Grpc.Core.Tests { public class PInvokeTest { static readonly NativeMethods Native = NativeMethods.Get(); int counter; /// <summary> /// (~1.26us .NET Windows) /// </summary> [Test] public void CompletionQueueCreateSyncDestroyBenchmark() { GrpcEnvironment.AddRef(); // completion queue requires gRPC environment being initialized. BenchmarkUtil.RunBenchmark( 10, 10, () => { CompletionQueueSafeHandle cq = CompletionQueueSafeHandle.CreateSync(); cq.Dispose(); }); GrpcEnvironment.ReleaseAsync().Wait(); } /// <summary> /// Approximate results: /// (~80ns Mono Linux) /// (~110ns .NET Windows) /// </summary> [Test] [Category("Performance")] [Ignore("Prevent running on Jenkins")] public void NativeCallbackBenchmark() { NativeCallbackTestDelegate handler = Handler; counter = 0; BenchmarkUtil.RunBenchmark( 1000000, 10000000, () => { Native.grpcsharp_test_callback(handler); }); Assert.AreNotEqual(0, counter); } /// <summary> /// Creating a new native-to-managed callback has significant overhead /// compared to using an existing one. We need to be aware of this. /// (~50us on Mono Linux!!!) /// (~1.1us on .NET Windows) /// </summary> [Test] [Category("Performance")] [Ignore("Prevent running on Jenkins")] public void NewNativeCallbackBenchmark() { counter = 0; BenchmarkUtil.RunBenchmark( 10000, 10000, () => { Native.grpcsharp_test_callback(new NativeCallbackTestDelegate(Handler)); }); Assert.AreNotEqual(0, counter); } /// <summary> /// Tests overhead of a simple PInvoke call. /// (~46ns .NET Windows) /// </summary> [Test] [Category("Performance")] [Ignore("Prevent running on Jenkins")] public void NopPInvokeBenchmark() { BenchmarkUtil.RunBenchmark( 1000000, 100000000, () => { Native.grpcsharp_test_nop(IntPtr.Zero); }); } private void Handler(bool success) { counter++; } } }