summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvincents <vincents@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-07 11:09:07 +0000
committervincents <vincents@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-07 11:09:07 +0000
commit1bb854c3702669581e57659f69ffbe4f425370d6 (patch)
tree73daf3fa7feef04ad49c1bdbe35c05e5e0b02a84
parent21fca44454f34369f5e80572ce2c28621d6a8adb (diff)
downloadfpc-1bb854c3702669581e57659f69ffbe4f425370d6.tar.gz
* improved fannkuch benchmark
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@9668 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--tests/bench/shootout/src/fannkuch.pp62
1 files changed, 34 insertions, 28 deletions
diff --git a/tests/bench/shootout/src/fannkuch.pp b/tests/bench/shootout/src/fannkuch.pp
index 76fdfc4bcf..6d814046b9 100644
--- a/tests/bench/shootout/src/fannkuch.pp
+++ b/tests/bench/shootout/src/fannkuch.pp
@@ -1,3 +1,4 @@
+program fannkuch;
{ The Computer Language Shootout
http://shootout.alioth.debian.org/
@@ -25,21 +26,12 @@ procedure swap(var a, b: longint); inline;
var tmp: longint;
begin tmp := a; a := b; b := tmp end;
-procedure roll_down( var a : array of longint ); inline;
-var tmp : longint;
-begin
- tmp := a[ 0 ];
- move( a[1], a[0], high(a)*sizeof(longint) );
- a[ high(a) ] := tmp;
-end;
-
-
-procedure reverse( var a: array of longint ); inline;
+procedure reverse( k: longint); inline;
var
pi, pj : pLongint;
begin
- pi := @a[0];
- pj := @a[high(a)];
+ pi := @permu_copy[1];
+ pj := @permu_copy[k-1];
while pi<pj do
begin
swap(pi^, pj^);
@@ -51,6 +43,8 @@ end;
function NextPermutation: boolean;
var
r0: longint;
+ tmp: LongInt;
+ i : longint;
begin
r0 := r; // use local variable
NextPermutation := true;
@@ -60,7 +54,11 @@ begin
NextPermutation := false;
break;
end;
- roll_down( permu[ 0 .. r0 ] );
+ tmp := permu[0];
+ for i := 1 to r0 do
+ permu[i-1] := permu[i];
+ permu[r0] := tmp;
+
dec(count[r0]);
if count[r0] > 0 then
break;
@@ -69,9 +67,26 @@ begin
r := r0;
end;
+function countflips: integer; inline;
+var
+ last: LongInt;
+ tmp: LongInt;
+begin
+ countflips := 0;
+ last := permu_copy[0];
+ repeat
+ // Reverse part of the array.
+ reverse(last);
+ tmp := permu_copy[ last ];
+ permu_copy[ last ] := last;
+ last := tmp;
+ inc(countflips);
+ until last = 0;
+end;
+
function fannkuch: longint;
var
- print30, m, i, last, tmp, flips: longint;
+ print30, m, i, flips: longint;
begin
print30 := 0;
fannkuch := 0;
@@ -84,8 +99,10 @@ begin
repeat
if print30 < 30 then
begin
- for i := 0 to m do write(permu[i] + 1);
- writeln; inc(print30);
+ for i := 0 to m do
+ write(permu[i] + 1);
+ writeln;
+ inc(print30);
end;
while r <> 1 do
begin
@@ -95,18 +112,7 @@ begin
if (permu[0]<>0) and (permu[m]<>m) then
begin
move(permu[0], permu_copy[0], sizeof(longint)*n);
- flips := 0;
-
- last := permu_copy[0];
- repeat
- // Reverse part of the array.
- reverse( permu_copy[ 1 .. last-1 ] );
- tmp := permu_copy[ last ];
- permu_copy[ last ] := last;
- last := tmp;
- inc(flips);
- until last = 0;
-
+ flips := countflips;
if flips > fannkuch then
fannkuch := flips;
end;