1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
6 using Microsoft.Xunit.Performance;
8 using System.Runtime.CompilerServices;
11 [assembly: OptimizeForBenchmarks]
13 namespace Benchstone.BenchI
18 public const int Iterations = 1;
20 public const int Iterations = 400;
23 private const int PuzzleSize = 511;
24 private const int ClassMax = 3;
25 private const int TypeMax = 12;
26 private const int D = 8;
28 private int[] _pieceCount = new int[ClassMax + 1];
29 private int[] _class = new int[TypeMax + 1];
30 private int[] _pieceMax = new int[TypeMax + 1];
31 private bool[] _puzzle = new bool[PuzzleSize + 1];
35 private static T[][] AllocArray<T>(int n1, int n2)
37 T[][] a = new T[n1][];
38 for (int i = 0; i < n1; ++i)
46 private bool Fit(int i, int j)
48 for (int k = 0; k <= _pieceMax[i]; k++)
62 private int Place(int i, int j)
65 for (k = 0; k <= _pieceMax[i]; k++)
69 _puzzle[j + k] = true;
73 _pieceCount[_class[i]] = _pieceCount[_class[i]] - 1;
75 for (k = j; k <= PuzzleSize; k++)
86 private void RemoveLocal(int i, int j)
88 for (int k = 0; k <= _pieceMax[i]; k++)
92 _puzzle[j + k] = false;
96 _pieceCount[_class[i]] = _pieceCount[_class[i]] + 1;
99 private bool Trial(int j)
101 for (int i = 0; i <= TypeMax; i++)
103 if (_pieceCount[_class[i]] != 0)
108 if (Trial(k) || (k == 0))
129 for (m = 0; m <= PuzzleSize; m++)
134 for (i = 1; i <= 5; i++)
136 for (j = 1; j <= 5; j++)
138 for (k = 1; k <= 5; k++)
140 _puzzle[i + D * (j + D * k)] = false;
145 for (i = 0; i <= TypeMax; i++)
147 for (m = 0; m <= PuzzleSize; m++)
153 for (i = 0; i <= 3; i++)
155 for (j = 0; j <= 1; j++)
157 for (k = 0; k <= 0; k++)
159 _p[0][i + D * (j + D * k)] = true;
165 _pieceMax[0] = 3 + D * 1 + D * D * 0;
167 for (i = 0; i <= 1; i++)
169 for (j = 0; j <= 0; j++)
171 for (k = 0; k <= 3; k++)
173 _p[1][i + D * (j + D * k)] = true;
179 _pieceMax[1] = 1 + D * 0 + D * D * 3;
181 for (i = 0; i <= 0; i++)
183 for (j = 0; j <= 3; j++)
185 for (k = 0; k <= 1; k++)
187 _p[2][i + D * (j + D * k)] = true;
192 _pieceMax[2] = 0 + D * 3 + D * D * 1;
194 for (i = 0; i <= 1; i++)
196 for (j = 0; j <= 3; j++)
198 for (k = 0; k <= 0; k++)
200 _p[3][i + D * (j + D * k)] = true;
206 _pieceMax[3] = 1 + D * 3 + D * D * 0;
208 for (i = 0; i <= 3; i++)
210 for (j = 0; j <= 0; j++)
212 for (k = 0; k <= 1; k++)
214 _p[4][i + D * (j + D * k)] = true;
220 _pieceMax[4] = 3 + D * 0 + D * D * 1;
222 for (i = 0; i <= 0; i++)
224 for (j = 0; j <= 1; j++)
226 for (k = 0; k <= 3; k++)
228 _p[5][i + D * (j + D * k)] = true;
234 _pieceMax[5] = 0 + D * 1 + D * D * 3;
236 for (i = 0; i <= 2; i++)
238 for (j = 0; j <= 0; j++)
240 for (k = 0; k <= 0; k++)
242 _p[6][i + D * (j + D * k)] = true;
248 _pieceMax[6] = 2 + D * 0 + D * D * 0;
250 for (i = 0; i <= 0; i++)
252 for (j = 0; j <= 2; j++)
254 for (k = 0; k <= 0; k++)
256 _p[7][i + D * (j + D * k)] = true;
262 _pieceMax[7] = 0 + D * 2 + D * D * 0;
264 for (i = 0; i <= 0; i++)
266 for (j = 0; j <= 0; j++)
268 for (k = 0; k <= 2; k++)
270 _p[8][i + D * (j + D * k)] = true;
276 _pieceMax[8] = 0 + D * 0 + D * D * 2;
278 for (i = 0; i <= 1; i++)
280 for (j = 0; j <= 1; j++)
282 for (k = 0; k <= 0; k++)
284 _p[9][i + D * (j + D * k)] = true;
289 _pieceMax[9] = 1 + D * 1 + D * D * 0;
291 for (i = 0; i <= 1; i++)
293 for (j = 0; j <= 0; j++)
295 for (k = 0; k <= 1; k++)
297 _p[10][i + D * (j + D * k)] = true;
303 _pieceMax[10] = 1 + D * 0 + D * D * 1;
305 for (i = 0; i <= 0; i++)
307 for (j = 0; j <= 1; j++)
309 for (k = 0; k <= 1; k++)
311 _p[11][i + D * (j + D * k)] = true;
317 _pieceMax[11] = 0 + D * 1 + D * D * 1;
319 for (i = 0; i <= 1; i++)
321 for (j = 0; j <= 1; j++)
323 for (k = 0; k <= 1; k++)
325 _p[12][i + D * (j + D * k)] = true;
331 _pieceMax[12] = 1 + D * 1 + D * D * 1;
336 m = 1 + D * (1 + D * 1);
354 [MethodImpl(MethodImplOptions.NoInlining)]
357 _p = AllocArray<bool>(TypeMax + 1, PuzzleSize + 1);
361 for (int i = 0; i < Iterations; ++i)
370 public static void Test()
372 Puzzle P = new Puzzle();
373 foreach (var iteration in Benchmark.Iterations)
375 using (iteration.StartMeasurement())
382 private static bool TestBase()
384 Puzzle P = new Puzzle();
385 bool result = P.Bench();
389 public static int Main()
391 bool result = TestBase();
392 return (result ? 100 : -1);