Skip to content

Commit bc59d48

Browse files
authored
AggressiveOptimization in InProcess toolchains (#2335)
* Apply `AggressiveOptimization` to workload actions in `InProcess` toolchains. * Placed constants in `BenchmarkDotNet.Portability.CodeGenHelper`.
1 parent dc9b804 commit bc59d48

File tree

8 files changed

+113
-91
lines changed

8 files changed

+113
-91
lines changed

src/BenchmarkDotNet/Helpers/Reflection.Emit/MethodBuilderExtensions.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using BenchmarkDotNet.Portability;
2+
using System;
23
using System.Collections.Generic;
34
using System.Linq;
45
using System.Reflection;
@@ -37,5 +38,13 @@ public static MethodBuilder SetNoOptimizationImplementationFlag(this MethodBuild
3738

3839
return methodBuilder;
3940
}
41+
42+
public static MethodBuilder SetAggressiveOptimizationImplementationFlag(this MethodBuilder methodBuilder)
43+
{
44+
methodBuilder.SetImplementationFlags(
45+
methodBuilder.GetMethodImplementationFlags() | CodeGenHelper.AggressiveOptimizationOptionForEmit);
46+
47+
return methodBuilder;
48+
}
4049
}
4150
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
4+
namespace BenchmarkDotNet.Portability
5+
{
6+
public static class CodeGenHelper
7+
{
8+
// AggressiveOptimization is not available in netstandard2.0, so just use the value casted to enum.
9+
public const MethodImplOptions AggressiveOptimizationOption = (MethodImplOptions) 512;
10+
public const MethodImplAttributes AggressiveOptimizationOptionForEmit = (MethodImplAttributes) 512;
11+
}
12+
}

src/BenchmarkDotNet/Templates/BenchmarkType.txt

Lines changed: 20 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,7 @@
113113

114114
private BenchmarkDotNet.Engines.Consumer consumer = new BenchmarkDotNet.Engines.Consumer();
115115

116-
#if NETCOREAPP3_0_OR_GREATER
117-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
118-
#endif
116+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
119117
private void OverheadActionUnroll(System.Int64 invokeCount)
120118
{
121119
$LoadArguments$
@@ -125,9 +123,7 @@
125123
}
126124
}
127125

128-
#if NETCOREAPP3_0_OR_GREATER
129-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
130-
#endif
126+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
131127
private void OverheadActionNoUnroll(System.Int64 invokeCount)
132128
{
133129
$LoadArguments$
@@ -137,9 +133,7 @@
137133
}
138134
}
139135

140-
#if NETCOREAPP3_0_OR_GREATER
141-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
142-
#endif
136+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
143137
private void WorkloadActionUnroll(System.Int64 invokeCount)
144138
{
145139
$LoadArguments$
@@ -149,9 +143,7 @@
149143
}
150144
}
151145

152-
#if NETCOREAPP3_0_OR_GREATER
153-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
154-
#endif
146+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
155147
private void WorkloadActionNoUnroll(System.Int64 invokeCount)
156148
{
157149
$LoadArguments$
@@ -175,9 +167,7 @@
175167

176168
#elif RETURNS_NON_CONSUMABLE_STRUCT_$ID$
177169

178-
#if NETCOREAPP3_0_OR_GREATER
179-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
180-
#endif
170+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
181171
private void OverheadActionUnroll(System.Int64 invokeCount)
182172
{
183173
$LoadArguments$
@@ -189,9 +179,7 @@
189179
BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxing(result);
190180
}
191181

192-
#if NETCOREAPP3_0_OR_GREATER
193-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
194-
#endif
182+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
195183
private void OverheadActionNoUnroll(System.Int64 invokeCount)
196184
{
197185
$LoadArguments$
@@ -203,9 +191,7 @@
203191
BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxing(result);
204192
}
205193

206-
#if NETCOREAPP3_0_OR_GREATER
207-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
208-
#endif
194+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
209195
private void WorkloadActionUnroll(System.Int64 invokeCount)
210196
{
211197
$LoadArguments$
@@ -217,9 +203,7 @@
217203
NonGenericKeepAliveWithoutBoxing(result);
218204
}
219205

220-
#if NETCOREAPP3_0_OR_GREATER
221-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
222-
#endif
206+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
223207
private void WorkloadActionNoUnroll(System.Int64 invokeCount)
224208
{
225209
$LoadArguments$
@@ -250,9 +234,7 @@
250234

251235
#elif RETURNS_BYREF_$ID$
252236

253-
#if NETCOREAPP3_0_OR_GREATER
254-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
255-
#endif
237+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
256238
private void OverheadActionUnroll(System.Int64 invokeCount)
257239
{
258240
$LoadArguments$
@@ -264,9 +246,7 @@
264246
BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxing(value);
265247
}
266248

267-
#if NETCOREAPP3_0_OR_GREATER
268-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
269-
#endif
249+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
270250
private void OverheadActionNoUnroll(System.Int64 invokeCount)
271251
{
272252
$LoadArguments$
@@ -280,9 +260,7 @@
280260

281261
private $WorkloadMethodReturnType$ workloadDefaultValueHolder = default($WorkloadMethodReturnType$);
282262

283-
#if NETCOREAPP3_0_OR_GREATER
284-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
285-
#endif
263+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
286264
private void WorkloadActionUnroll(System.Int64 invokeCount)
287265
{
288266
$LoadArguments$
@@ -294,9 +272,7 @@
294272
BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxing(ref alias);
295273
}
296274

297-
#if NETCOREAPP3_0_OR_GREATER
298-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
299-
#endif
275+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
300276
private void WorkloadActionNoUnroll(System.Int64 invokeCount)
301277
{
302278
$LoadArguments$
@@ -321,9 +297,7 @@
321297
}
322298
#elif RETURNS_BYREF_READONLY_$ID$
323299

324-
#if NETCOREAPP3_0_OR_GREATER
325-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
326-
#endif
300+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
327301
private void OverheadActionUnroll(System.Int64 invokeCount)
328302
{
329303
$LoadArguments$
@@ -335,9 +309,7 @@
335309
BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxing(value);
336310
}
337311

338-
#if NETCOREAPP3_0_OR_GREATER
339-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
340-
#endif
312+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
341313
private void OverheadActionNoUnroll(System.Int64 invokeCount)
342314
{
343315
$LoadArguments$
@@ -351,9 +323,7 @@
351323

352324
private $WorkloadMethodReturnType$ workloadDefaultValueHolder = default($WorkloadMethodReturnType$);
353325

354-
#if NETCOREAPP3_0_OR_GREATER
355-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
356-
#endif
326+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
357327
private void WorkloadActionUnroll(System.Int64 invokeCount)
358328
{
359329
$LoadArguments$
@@ -365,9 +335,7 @@
365335
BenchmarkDotNet.Engines.DeadCodeEliminationHelper.KeepAliveWithoutBoxingReadonly(alias);
366336
}
367337

368-
#if NETCOREAPP3_0_OR_GREATER
369-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
370-
#endif
338+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
371339
private void WorkloadActionNoUnroll(System.Int64 invokeCount)
372340
{
373341
$LoadArguments$
@@ -392,9 +360,7 @@
392360
}
393361
#elif RETURNS_VOID_$ID$
394362

395-
#if NETCOREAPP3_0_OR_GREATER
396-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
397-
#endif
363+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
398364
private void OverheadActionUnroll(System.Int64 invokeCount)
399365
{
400366
$LoadArguments$
@@ -404,9 +370,7 @@
404370
}
405371
}
406372

407-
#if NETCOREAPP3_0_OR_GREATER
408-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
409-
#endif
373+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
410374
private void OverheadActionNoUnroll(System.Int64 invokeCount)
411375
{
412376
$LoadArguments$
@@ -416,9 +380,7 @@
416380
}
417381
}
418382

419-
#if NETCOREAPP3_0_OR_GREATER
420-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
421-
#endif
383+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
422384
private void WorkloadActionUnroll(System.Int64 invokeCount)
423385
{
424386
$LoadArguments$
@@ -428,9 +390,7 @@
428390
}
429391
}
430392

431-
#if NETCOREAPP3_0_OR_GREATER
432-
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveOptimization)]
433-
#endif
393+
[System.Runtime.CompilerServices.MethodImpl(BenchmarkDotNet.Portability.CodeGenHelper.AggressiveOptimizationOption)]
434394
private void WorkloadActionNoUnroll(System.Int64 invokeCount)
435395
{
436396
$LoadArguments$

src/BenchmarkDotNet/Toolchains/InProcess/Emit/Implementation/Emitters/RunnableEmitter.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -657,13 +657,14 @@ private MethodBuilder EmitActionImpl(string methodName, RunnableActionKind actio
657657
}
658658

659659
// .method private hidebysig
660-
// instance void OverheadActionUnroll(int64 invokeCount) cil managed
660+
// instance void OverheadActionUnroll(int64 invokeCount) cil managed aggressiveoptimization
661661
var toArg = new EmitParameterInfo(0, InvokeCountParamName, typeof(long));
662662
var actionMethodBuilder = runnableBuilder.DefineNonVirtualInstanceMethod(
663663
methodName,
664664
MethodAttributes.Private,
665665
EmitParameterInfo.CreateReturnVoidParameter(),
666-
toArg);
666+
toArg)
667+
.SetAggressiveOptimizationImplementationFlag();
667668
toArg.SetMember(actionMethodBuilder);
668669

669670
// Emit impl

src/BenchmarkDotNet/Toolchains/InProcess/NoEmit/BenchmarkAction.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ public abstract class BenchmarkAction
1414

1515
/// <summary>Gets or sets invoke multiple times callback.</summary>
1616
/// <value>Invoke multiple times callback.</value>
17-
public Action<long> InvokeMultiple { get; protected set; }
17+
public Action<long> InvokeUnroll { get; protected set; }
18+
public Action<long> InvokeNoUnroll{ get; protected set; }
1819

1920
/// <summary>Gets the last run result.</summary>
2021
/// <value>The last run result.</value>

0 commit comments

Comments
 (0)