122 lines
3.5 KiB
C#
122 lines
3.5 KiB
C#
#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++;
|
|
}
|
|
}
|
|
}
|