'BEGIN' 'COMMENT' The Whetstone Benchmark. See: A Synthetic Benchmark, H.J. Curnow and B.A. Whichmann, The Computing Journal, Volume 19 Number 1 Feb 1976, P. 43-49 Some results (in thousands of Whetstone Instructions per second): IBM 3090: (Delft ?) Algol Compiler 5000 Sun 3/60: Nase Algol Interpreter 10 Nase Algol2C 400 Sparc 2: Nase Algol Interpreter 63 Nase Algol2C 4200 Pyramid ??: Nase Algol Interpreter 20 ``Nase'' indicates NASE A60. ; 'REAL' X1, X2, X3, X4, X, Y, Z, T, T1, T2; 'ARRAY' E1[1:4]; 'INTEGER' I, J, K, L, N1, N2, N3, N4, N5, N6, N7, N8, N9, N10,N11; 'PROCEDURE' PA(E); 'ARRAY' E; 'BEGIN' 'INTEGER' J; J := 0; LAB: E[1] := (E[1] + E[2] + E[3] - E[4]) * T; E[2] := (E[1] + E[2] - E[3] + E[4]) * T; E[3] := (E[1] - E[2] + E[3] + E[4]) * T; E[4] := (- E[1] + E[2] + E[3] + E[4]) / T2; J := J + 1; 'IF' J < 6 'THEN' 'GOTO' LAB; 'END'; 'PROCEDURE' P0; 'BEGIN' E1[J] := E1[K]; E1[K] := E1[L]; E1[L] := E1[J]; 'END'; 'PROCEDURE' P3(X, Y, Z); 'VALUE' X, Y; 'REAL' X, Y, Z; 'BEGIN' X := T * (X + Y); Y := T * (X + Y); Z := (X + Y) / T2; 'END'; 'PROCEDURE' POUT (N, J, K, X1, X2, X3, X4); 'VALUE' N, J, K, X1, X2, X3, X4; 'INTEGER' N, J, K; 'REAL' X1, X2, X3, X4; 'BEGIN' OUTREAL (1, N); OUTREAL (1, J); OUTREAL (1, K); OUTREAL (1, X1); OUTREAL (1, X2); OUTREAL (1, X3); OUTREAL (1, X4); OUTSTRING (1, "\N"); 'END'; 'COMMENT' initialize constants ; T := 0.499975; T1 := 0.50025; T2 := 2.0; 'COMMENT' read the value of i, controlling total wight: if i = 10 the total whight is one million Whetstone instructions ; 'COMMENT' inreal (2, i) ; I := 10; N1 := 0; N2 := 12 * I; N3 := 14 * I; N4 := 345 * I; N5 := 0; N6 := 210 * I; N7 := 32 * I; N8 := 899 * I; N9 := 616 * I; N10 := 0; N11 := 93 * I; 'COMMENT' module 1: simple identifiers ; X1 := 1.0; X2 := X3 := X4 := - 1.0; 'FOR' I := 1 'STEP' 1 'UNTIL' N1 'DO' 'BEGIN' X1 := (X1 + X2 + X3 - X4) * T; X2 := (X1 + X2 - X3 + X4) * T; X3 := (X1 - X2 + X3 + X4) * T; X4 := (- X1 + X2 + X3 + X4) * T; 'END'; POUT (N1, N1, N1, X1, X2, X3, X4); 'COMMENT' module 2: array elements ; E1[1] := 1.0; E1[2] := E1[3] := E1[4] := -1.0; 'FOR' I := 1 'STEP' 1 'UNTIL' N2 'DO' 'BEGIN' E1[1] := (E1[1] + E1[2] + E1[3] - E1[4]) * T; E1[2] := (E1[1] + E1[2] - E1[3] + E1[4]) * T; E1[3] := (E1[1] - E1[2] + E1[3] + E1[4]) * T; E1[4] := (- E1[1] + E1[2] + E1[3] + E1[4]) * T; 'END'; POUT (N2, N3, N2, E1[1], E1[2], E1[3], E1[4]); 'COMMENT' module 3: as array parameter ; 'FOR' I:= 1 'STEP' 1 'UNTIL' N3 'DO' PA(E1); POUT (N3, N2, N2, E1[1], E1[2], E1[3], E1[4]); 'COMMENT' module 4: conditional jumps ; J := 1; 'FOR' I := 1 'STEP' 1 'UNTIL' N4 'DO' 'BEGIN' 'IF' J = 1 'THEN' J := 2 'ELSE' J := 3; 'IF' J > 2 'THEN' J := 0 'ELSE' J := 1; 'IF' J < 1 'THEN' J := 1 'ELSE' J := 0; 'END'; POUT (N4, J, J, X1, X2, X3, X4); 'COMMENT' module 5: omitted ; 'COMMENT' module 6: integer arithmetik ; J := 1; K := 2; L := 3; 'FOR' I := 1 'STEP' 1 'UNTIL' N6 'DO' 'BEGIN' J := J * (K - J) * (L - K); K := L * K - (L - J) * K; L := (L - K) * (K + J) ; 'COMMENT' typo in TCJ ; E1[L-1] := J + K + L; E1[K-1] := J * K * L; 'END'; POUT (N6, J, K, E1[1], E1[2], E1[3], E1[4]); 'COMMENT' module 7: trig functions ; X := Y := 0.5; 'FOR' I := 1 'STEP' 1 'UNTIL' N7 'DO' 'BEGIN' X := T * ARCTAN (T2 * SIN (X) * COS (X) / (COS (X + Y) + COS (X - Y) - 1.0)); Y := T * ARCTAN (T2 * SIN (Y) * COS (Y) / (COS (X + Y) + COS (X - Y) - 1.0)); 'END'; POUT (N7, J, K, X, X, Y, Y); 'COMMENT' module 8: procedure calls ; X := Y := Z := 1.0; 'FOR' I := 1 'STEP' 1 'UNTIL' N8 'DO' P3 (X, Y, Z); POUT (N8, J, K, X, Y, Z, Z); 'COMMENT' module 9: array references ; J := 1; K := 2; L := 3; E1[1] := 1.0; E1[2] := 2.0; E1[3] := 3.0; 'FOR' I := 1 'STEP' 1 'UNTIL' N9 'DO' P0; POUT (N9, J, K, E1[1], E1[2], E1[3], E1[4]); 'COMMENT' module 10: integer arithmetik ; J := 2; K := 3; 'FOR' I := 1 'STEP' 1 'UNTIL' N10 'DO' 'BEGIN' J := J + K; K := J + K; J := K - J; K := K -J -J; 'END'; POUT (N10, J, K, X1, X2, X3, X4); 'COMMENT' module 11: standard functions ; X := 0.75; 'FOR' I := 1 'STEP' 1 'UNTIL' N11 'DO' X := SQRT (EXP (LN (X) / T1)); POUT (N11, J, K, X, X, X, X); 'END'