diff --git a/src/BenchmarkDotNet/Code/DeclarationsProvider.cs b/src/BenchmarkDotNet/Code/DeclarationsProvider.cs index 058f912e53..5f2eca39a6 100644 --- a/src/BenchmarkDotNet/Code/DeclarationsProvider.cs +++ b/src/BenchmarkDotNet/Code/DeclarationsProvider.cs @@ -150,7 +150,7 @@ internal class TaskDeclarationsProvider : DeclarationsProvider { public TaskDeclarationsProvider(Descriptor descriptor) : base(descriptor) { } - public override string ExtraDefines => "#define RETURNS_AWAITABLE"; + public override string ReturnsDefinition => "RETURNS_AWAITABLE"; public override string AwaiterTypeName => WorkloadMethodReturnType.GetMethod(nameof(Task.GetAwaiter), BindingFlags.Public | BindingFlags.Instance).ReturnType.GetCorrectCSharpTypeName(); diff --git a/src/BenchmarkDotNet/Engines/IEngine.cs b/src/BenchmarkDotNet/Engines/IEngine.cs index c01a398ed0..40bb64ce69 100644 --- a/src/BenchmarkDotNet/Engines/IEngine.cs +++ b/src/BenchmarkDotNet/Engines/IEngine.cs @@ -6,6 +6,7 @@ using BenchmarkDotNet.Reports; using JetBrains.Annotations; using Perfolizer.Horology; +using NotNullAttribute = JetBrains.Annotations.NotNullAttribute; namespace BenchmarkDotNet.Engines { diff --git a/src/BenchmarkDotNet/Templates/BenchmarkType.txt b/src/BenchmarkDotNet/Templates/BenchmarkType.txt index 8b66bab4f9..bf2d99bae5 100644 --- a/src/BenchmarkDotNet/Templates/BenchmarkType.txt +++ b/src/BenchmarkDotNet/Templates/BenchmarkType.txt @@ -90,19 +90,19 @@ [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private void Dummy1() { - dummyVar++;@DummyUnroll@ + @DummyUnroll@ } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private void Dummy2() { - dummyVar++;@DummyUnroll@ + @DummyUnroll@ } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private void Dummy3() { - dummyVar++;@DummyUnroll@ + @DummyUnroll@ } private $OverheadMethodReturnTypeName$ __Overhead($ArgumentsDefinition$) // __ is to avoid possible name conflict @@ -121,18 +121,27 @@ private $AwaiterTypeName$ currentAwaiter; partial void __SetContinuation() => continuation = __Continuation; - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif // Awaits are not unrolled. private System.Threading.Tasks.ValueTask OverheadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { return OverheadActionImpl(invokeCount, clock); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { return OverheadActionImpl(invokeCount, clock); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionImpl(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { repeatsRemaining = invokeCount; @@ -153,17 +162,26 @@ } return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { return WorkloadActionImpl(invokeCount, clock); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { return WorkloadActionImpl(invokeCount, clock); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionImpl(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { repeatsRemaining = invokeCount; @@ -171,7 +189,10 @@ __RunTask(); return new System.Threading.Tasks.ValueTask(valueTaskSource, valueTaskSource.Version); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private void __RunTask() { try @@ -198,7 +219,10 @@ startedClock = default(Perfolizer.Horology.StartedClock); valueTaskSource.SetResult(clockspan); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private void __Continuation() { try @@ -235,7 +259,10 @@ #elif RETURNS_CONSUMABLE_$ID$ private BenchmarkDotNet.Engines.Consumer consumer = new BenchmarkDotNet.Engines.Consumer(); - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -246,7 +273,10 @@ } return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -257,7 +287,10 @@ } return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -268,7 +301,10 @@ } return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -294,6 +330,9 @@ #elif RETURNS_NON_CONSUMABLE_STRUCT_$ID$ +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -306,7 +345,10 @@ BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxing(result); return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -319,7 +361,10 @@ BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxing(result); return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -332,7 +377,10 @@ NonGenericKeepAliveWithoutBoxing(result); return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -365,6 +413,9 @@ #elif RETURNS_BYREF_$ID$ +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -377,7 +428,10 @@ BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxing(value); return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -392,7 +446,10 @@ } private $WorkloadMethodReturnType$ workloadDefaultValueHolder = default($WorkloadMethodReturnType$); - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -406,6 +463,9 @@ return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -432,6 +492,9 @@ } #elif RETURNS_BYREF_READONLY_$ID$ +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -444,7 +507,10 @@ BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxing(value); return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -459,7 +525,10 @@ } private $WorkloadMethodReturnType$ workloadDefaultValueHolder = default($WorkloadMethodReturnType$); - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -473,6 +542,9 @@ return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -499,6 +571,9 @@ } #elif RETURNS_VOID_$ID$ +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -509,7 +584,10 @@ } return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask OverheadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -520,7 +598,10 @@ } return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } - + +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -532,6 +613,9 @@ return new System.Threading.Tasks.ValueTask(startedClock.GetElapsed()); } +#if NETCOREAPP3_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)] +#endif private System.Threading.Tasks.ValueTask WorkloadActionNoUnroll(System.Int64 invokeCount, Perfolizer.Horology.IClock clock) { $LoadArguments$ @@ -552,5 +636,5 @@ $WorkloadMethodCall$; } } -#endif +#endif // RETURNS } \ No newline at end of file diff --git a/src/BenchmarkDotNet/Toolchains/InProcess.Emit.Implementation/Emitters/TaskConsumeEmitter.cs b/src/BenchmarkDotNet/Toolchains/InProcess.Emit.Implementation/Emitters/TaskConsumeEmitter.cs index 12997a3654..355dc353f4 100644 --- a/src/BenchmarkDotNet/Toolchains/InProcess.Emit.Implementation/Emitters/TaskConsumeEmitter.cs +++ b/src/BenchmarkDotNet/Toolchains/InProcess.Emit.Implementation/Emitters/TaskConsumeEmitter.cs @@ -91,9 +91,9 @@ protected override void OnEmitCtorBodyOverride(ConstructorBuilder constructorBui IL_0006: ldarg.0 IL_0007: call instance void BenchmarkDotNet.Autogenerated.Runnable_0::__SetContinuation() */ - continuationMethod = EmitSetContinuationImpl(runnableEmitter); + setContinuationMethod = EmitSetContinuationImpl(runnableEmitter); ilBuilder.Emit(OpCodes.Ldarg_0); - ilBuilder.Emit(OpCodes.Call, continuationMethod); + ilBuilder.Emit(OpCodes.Call, setContinuationMethod); } public override MethodBuilder EmitActionImpl(RunnableEmitter runnableEmitter, string methodName, RunnableActionKind actionKind, int unrollFactor) @@ -344,7 +344,7 @@ class Perfolizer.Horology.IClock clock private MethodBuilder EmitSetContinuationImpl(RunnableEmitter runnableEmitter) { /* - .method private hidebysig + .method private hidebysig instance void __SetContinuation () cil managed */ var actionMethodBuilder = runnableEmitter.runnableBuilder.DefinePrivateVoidInstanceMethod(SetContinuationMethodName);