🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.lang.modula2
3 messages
3 total messages Started by nagler Fri, 28 Aug 1987 05:53
BITSET Benchmarks
#3789
Author: nagler
Date: Fri, 28 Aug 1987 05:53
133 lines
5510 bytes
After reading yet another message about inefficient operations in
Modula-2 versus Turbo (or C), I decided to do some benchmarks to
see if they were really true. This message contains the source 
to a C and a Modula-2 program.  The programs were compiled and run on 
an unloaded diskless Sun 3/50.  The compile times are included for 
the sake of completeness.  The compilers were both supplied by Sun,
but I should like to say that the Sun C compiler is much more mature
than its sibling M2 compiler.  The M2 compiler was derrived from the
original Lilith four-pass version and was retrofitted to Sun's standard
code generator.

The programs execute all the Modula-2 set operations in a
loop for 10,000,000 iterations.  Note that Modula-2 was used as the 
base, because there are more native set operations in Modula-2 
than there are in C.  C "register" declarations weren't used, 
because the Sun M2 compiler does not do register allocation which 
is the equivalent to "register" in C.  I assume that the register
allocation mechanism is the job of the code generator or optimizer.
As I found out later, the optimizer doesn't seem to do register
allocation/colouring at all.

The 2.0 FCS version of the Sun M2 compiler and the 3.2 SunOS/C 
compiler were used.  Note that people seem to think that the Sun
C compiler generates good code.

Here are the results:
    % time m2c -nobounds -norange -O x.mod -e x -o x
    1.9u 2.9s 0:14 33% 5+4k 158+86io 24pf+0w
    % time cc -O -o y y.c
    1.6u 1.3s 0:06 42% 5+5k 83+44io 5pf+0w
    % time x
    197.2u 0.2s 3:18 99% 0+0k 2+0io 0pf+0w
    % time y
    190.3u 0.2s 3:11 99% 0+0k 2+0io 0pf+0w
    %

If you don't know how to read Unix gobbly-gook, the C program took
190 seconds of CPU to run and the M2 program took 197 seconds.
So it turns out that C is 3% faster.  The -O flag is the optimizer,
but it doesn't appear to do too much for the Modula-2 or C.  Here are
the results of an unoptimized sequence:

    % time m2c -nobounds -norange x.mod -e x -o x
    1.5u 2.6s 0:14 29% 5+3k 154+82io 25pf+0w
    % time cc -o y y.c
    1.2u 1.2s 0:05 41% 5+4k 69+31io 5pf+0w
    % time x
    212.5u 0.2s 3:34 99% 0+0k 2+0io 0pf+0w
    % time y
    201.0u 0.0s 3:21 100% 0+0k 0+0io 0pf+0w

The results tell you that the optimizer doesn't do much.  The C
program consumed 201 seconds of CPU (5% speed up) and the M2 program
took 212 seconds (7% speed up).  The optimizer didn't reduce the
size of the code by an appreciable amount either.

The last test I performed was to change the C program to use register
variables.  The results are obviously stupendous.

    % time cc -DUseRegisters -o y y.c
    1.1u 1.2s 0:05 46% 5+4k 69+38io 5pf+0w
    % time y
    80.5u 0.0s 1:20 99% 0+0k 1+0io 0pf+0w
    % time cc -O -DUseRegisters -o y y.c
    1.4u 1.5s 0:06 45% 5+5k 97+43io 5pf+0w
    % time y
    58.6u 0.0s 0:58 99% 0+0k 2+0io 0pf+0w

The unoptimized version took 81 seconds and with the optimizer the
program speed up by 27% to 59 seconds.  The absolute speed up was
twice as much as the "non-register" C version.  The marinal change
was 5 1/2 times that of the "non-register" version.

I'll let you draw your own conclusions from all of this.  I am still
using Modula-2 in the hopes that some day, someone will take a couple
of months off to write an optimizer for Modula-2.  I have included the
test programs at the end of this note.  If nothing else, they server
as a crib sheet for translating between C and Modula-2.

Rob
-----------------------------------------------------------
MODULE x;
VAR
    a : BITSET;
    b : BITSET;
    c : BITSET;
    t : BOOLEAN;
    i : CARDINAL;
BEGIN
    
    FOR i := 0 TO 9999999 DO
	b := BITSET( CARDINAL( a ) * 2 );	(* b = a << 1; *)
	b := BITSET( CARDINAL( a ) DIV 2 );	(* b = a >> 1; *)
	INCL( a, 3 );				(* a |= ( 1 << 3 ); *)
	EXCL( a, 3 );				(* a &= ~( 1 << 3 ); *)
	c := a + b;				(* c = a | b; *)
	c := a - b;				(* c = a & ~b; *)
	c := a * b;				(* c = a & b; *)
	c := a / b;				(* c = a ^ b; *)

	t := 3 IN a;				(* t = a & ~( 1 << 3 ); *)
	t := a # b;				(* t = a != b; *)
	t := a <= b;				(* t = !( ( a | b ) & ~ a ); *)
	(* The < and > operators are not defined for sets *)
    END;

END x.

main()
  {
#ifdef UseRegisters
    register unsigned int a, b, c, t, i;
#else
    unsigned int a, b, c, t, i;
#endif UseRegisters
    
    for ( i = 0; i <= 9999999; i++ ) 
      {
	/* b := BITSET( CARDINAL( a ) * 2 );*/ 		b = a << 1;
	/* b := BITSET( CARDINAL( a ) DIV 2 ); */	b = a >> 1;
	/* INCL( a, 3 ); */			a |= ( 1 << 3 );
	/* EXCL( a, 3 ); */			a &= ~( 1 << 3 );
	/* c := a + b; */			c = a | b;
	/* c := a - b; */			c = a & ~b;
	/* c := a * b; */			c = a & b;
	/* c := a / b; */			c = a ^ b;

	/* t := 3 IN a; */			t = a & ~( 1 << 3 );
	/* t := a # b; */			t = a != b;
	/* t := a <= b; */			t = !( ( a | b ) & ~ a );
      }

  } /* main */
Re: Optimized M2
#3799
Author: Alan Lovejoy
Date: Mon, 31 Aug 1987 14:18
18 lines
1474 bytes
There is a company in Britain called Masthaven who are currenlty
marketing an optimizing Modula-2 compiler for UNIX/V.  Their
compiler was originally written by Mark White at Volition Systems,
but was never marketed for reasons I can't go into (I don't want
to hire a lawyer...).  A company in Seattle called ScenicSoft bought
limited rights to this compiler in 1984, and are currently marketing
their version for Stride/Sage machines.  This is probably the most
mature version available, since ScenicSoft has been working on it
longer than Masthaven.  I have the ScenicSoft version, and can report
that it is VERY good.  On a Stride 440 @12MHz with one wait state,
10 iterations of BYTE's Sieve benchmark (flags: ARRAY [0..8191])
executes in 1.14 seconds.  For comparison, hand-coded assembly 
executes in 0.91 seconds.

If you are interested, mail me and I'll mail you addresses and phone
numbers.

--alan@pdn
Re: BITSET Benchmarks
#3795
Author: michael
Date: Tue, 01 Sep 1987 22:35
16 lines
1286 bytes
Neulich schrieb nagler@olsen.UUCP (Robert Nagler):
  After reading yet another message about inefficient operations in
  Modula-2 versus Turbo (or C), I decided to do some benchmarks to
  see if they were really true.

Perhaps this is the right time to ask the net for all the
benchmarks for Modula-2, which are available. If you got one and
you are willing to share, please mail it to me.

    Thanks in advance
    Michael Schmidt
-- 
UUCP:  ...!seismo!unido!pbinfo!michael    |  Michael Schmidt
       or michael@pbinfo.UUCP             |  Universitaet-GH Paderborn, FB 17
CSNET: michael%pbinfo.uucp@Germany.CSNET  |  Warburger Str. 100
ARPA:  michael%pbinfo.uucp@seismo.css.gov |  D-4790 Paderborn, West Germany
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads