summaryrefslogtreecommitdiff
path: root/tests/src/JIT/Performance/CodeQuality/BenchmarksGame/fannkuch-redux/fannkuch-redux.csharp.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/JIT/Performance/CodeQuality/BenchmarksGame/fannkuch-redux/fannkuch-redux.csharp.cs')
-rw-r--r--tests/src/JIT/Performance/CodeQuality/BenchmarksGame/fannkuch-redux/fannkuch-redux.csharp.cs120
1 files changed, 120 insertions, 0 deletions
diff --git a/tests/src/JIT/Performance/CodeQuality/BenchmarksGame/fannkuch-redux/fannkuch-redux.csharp.cs b/tests/src/JIT/Performance/CodeQuality/BenchmarksGame/fannkuch-redux/fannkuch-redux.csharp.cs
new file mode 100644
index 0000000000..ea7a189e0b
--- /dev/null
+++ b/tests/src/JIT/Performance/CodeQuality/BenchmarksGame/fannkuch-redux/fannkuch-redux.csharp.cs
@@ -0,0 +1,120 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+/* The Computer Language Benchmarks Game
+ http://benchmarksgame.alioth.debian.org/
+
+ contributed by Isaac Gouy, transliterated from Mike Pall's Lua program
+
+ posted to Benchmarks Game as fannkuck-redux C# .NET Core #2
+ (http://benchmarksgame.alioth.debian.org/u64q/program.php?test=fannkuchredux&lang=csharpcore&id=2)
+ modified for use with xunit-performance
+*/
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Microsoft.Xunit.Performance;
+using Microsoft.Xunit.Performance.Api;
+using Xunit;
+
+namespace BenchmarksGame
+{
+ public class FannkuchRedux
+ {
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static int[] Bench(int n, bool verbose = false)
+ {
+ int[] p = new int[n], q = new int[n], s = new int[n];
+ int sign = 1, maxflips = 0, sum = 0, m = n - 1;
+ for (int i = 0; i < n; i++) { p[i] = i; q[i] = i; s[i] = i; }
+ do
+ {
+ // Copy and flip.
+ var q0 = p[0]; // Cache 0th element.
+ if (q0 != 0)
+ {
+ for (int i = 1; i < n; i++) q[i] = p[i]; // Work on a copy.
+ var flips = 1;
+ do
+ {
+ var qq = q[q0];
+ if (qq == 0)
+ { // ... until 0th element is 0.
+ sum += sign * flips;
+ if (flips > maxflips) maxflips = flips; // New maximum?
+ break;
+ }
+ q[q0] = q0;
+ if (q0 >= 3)
+ {
+ int i = 1, j = q0 - 1, t;
+ do { t = q[i]; q[i] = q[j]; q[j] = t; i++; j--; } while (i < j);
+ }
+ q0 = qq; flips++;
+ } while (true);
+ }
+ // Permute.
+ if (sign == 1)
+ {
+ var t = p[1]; p[1] = p[0]; p[0] = t; sign = -1; // Rotate 0<-1.
+ }
+ else
+ {
+ var t = p[1]; p[1] = p[2]; p[2] = t; sign = 1; // Rotate 0<-1 and 0<-1<-2.
+ for (int i = 2; i < n; i++)
+ {
+ var sx = s[i];
+ if (sx != 0) { s[i] = sx - 1; break; }
+ if (i == m) return new int[] { sum, maxflips }; // Out of permutations.
+ s[i] = i;
+ // Rotate 0<-...<-i+1.
+ t = p[0]; for (int j = 0; j <= i; j++) { p[j] = p[j + 1]; }
+ p[i + 1] = t;
+ }
+ }
+ } while (true);
+ }
+
+ // Commented out data left in source to provide checksums for each case
+ // Checksums calculated from the origonal source referenced at top of this source
+
+ [Benchmark(InnerIterationCount = 7)]
+ //[InlineData(7, 228)]
+ //[InlineData(8, 1616)]
+ //[InlineData(9, 8629)]
+ [InlineData(10, 73196)]
+ //[InlineData(11, 556355)]
+ //[InlineData(12, 3968050)]
+ public static void Test(int n, int checksum)
+ {
+ foreach (var iteration in Benchmark.Iterations)
+ {
+ int[] pfannkuchen = null;
+ using (iteration.StartMeasurement())
+ {
+ for (int i = 0; i < Benchmark.InnerIterationCount; ++i)
+ {
+ pfannkuchen = Bench(n);
+ }
+ }
+ Assert.Equal(checksum, pfannkuchen[0]);
+ }
+ }
+
+ public static bool VerifyBench(int n, int checksum)
+ {
+ int[] pfannkuchen = Bench(n);
+ return pfannkuchen[0] == checksum;
+ }
+
+ public static int Main(string[] args)
+ {
+ const int n = 7;
+ const int checksum = 228;
+
+ bool verified = VerifyBench(n, checksum);
+ return (verified ? 100 : -1);
+ }
+ }
+}