Digitool, Inc. MCL
Section
Home
Purchase
Download
Support
Contact
Site Map

Google
  Web digitool.com

Benchmarks

Relative Speed of MCL 4.0

MCL 4.0 is a fast, feature-complete, and stable PowerPC-native Common Lisp implementation. It runs the Gabriel benchmarks an average of 6 times faster on a 9500 than MCL 3.0p2k2 on a Quadra 950. It runs our CLOS benchmarks 5.4 times faster, factorial 7 times faster, scrolls text more than twice as fast, and compiles and loads files twice as fast.

The values in the tables represent the relative times taken to perform the given tasks. System 7.5.3 was installed on each machine, and MCL was given a 20 megabyte partition. Virtual Memory was turned off, 32 bit addressing was turned on, and the disk cache was set to 32k.


Summary Benchmarks
October 1, 1996

MCL-PPC
4.0
9500
MCL-PPC
3.9
9500
MCL-68k
3.0p2k2
9500
MCL-68k
3.0p2k2
7100
MCL-68k
3.0p2k2
950
MCL-68k
2.0.1
950
GABRIEL: Total
1.00 1.73 4.90 16.21 6.01 6.23
CLOS: Total
1.00 1.53 3.46 10.66 5.41 5.44
BIGNUM
1.00 0.90 2.98 12.13 6.95 7.71
Scrolling
1.00 1.18 1.80 4.38 2.31 1.90
Search files
1.00 0.85 1.14 1.59 1.12 1.76
Graphics
1.00 1.63 3.14 5.71 2.71 2.81
Compile and load 32 files
1.00 1.17 3.15 3.58 1.99 -


Gabriel Detailed Benchmarks
October 1, 1996

MCL-PPC
4.0
9500
MCL-PPC
3.9
9500
MCL-68k
3.0p2k2
9500
MCL-68k
3.0p2k2
7100
MCL-6k8
3.0p2k2
950
MCL-68k
2.0.1
950
Boyer: 1.00 1.01 2.70 7.36 4.06 4.11
Browse: 1.00 1.16 3.10 10.80 4.84 4.94
Destruct: 1.00 1.31 5.21 18.44 6.88 7.09
Traverse: Initialize: 1.00 1.21 3.89 14.22 5.13 5.51
Traverse: Traverse: 1.00 1.08 2.14 9.48 4.71 4.97
Tak: 1.00 1.00 3.30 10.52 5.26 4.90
STak: 1.00 1.72 6.76 16.49 9.74 9.79
CTak: 1.00 1.00 3.15 15.56 7.24 7.60
TakL: 1.00 1.15 1.92 10.23 5.07 4.68
TakR: 1.00 1.03 5.18 7.14 5.07 5.01
Deriv: 1.00 0.97 2.45 8.03 4.59 4.50
DDeriv: 1.00 0.98 1.97 6.28 3.44 3.42
Div2: Iterative: 1.00 0.97 6.81 15.28 8.81 9.69
Div2: Recursive: 1.00 0.98 5.42 12.71 8.10 8.42
FFT: 1.00 1.62 23.25 58.23 4.21 3.92
Puzzle: 1.00 1.46 3.50 6.76 2.99 5.44
Triang: 1.00 2.25 3.84 16.62 7.77 7.76
FRPoly: Power = 5 r = x + y + z + 1: 1.00 2.00 9.67 21.67 11.00 12.00
FRPoly: Power = 5 r2 = 1000r: 1.00 1.50 4.17 13.17 5.75 5.33
FRPoly: Power = 5 r3 = r in flonums: 1.00 1.33 16.33 36.33 5.89 4.56
FRPoly: Power = 10 r = x + y + z + 1: 1.00 1.62 5.63 12.33 6.62 7.05
FRPoly: Power = 10 r2 = 1000r: 1.00 1.18 2.61 8.98 3.90 3.54
FRPoly: Power = 10 r3 = r in flonums: 1.00 1.17 13.41 29.23 4.32 3.45
FRPoly: Power = 15 r = x + y + z + 1: 1.00 1.66 6.11 12.84 6.68 7.09
FRPoly: Power = 15 r2 = 1000r: 1.00 1.18 2.57 8.76 3.88 3.67
FRPoly: Power = 15 r3 = r in flonums: 1.00 1.19 14.34 29.54 4.27 3.37


CLOS Detailed Benchmarks
October 1, 1996

MCL-PPC
4.0
9500
MCL-PPC
3.9
9500
MCL-68k
3.0p2k2
9500
MCL-68k
3.0p2k2
7100
MCL-6k8
3.0p2k2
950
MCL-68k
2.0.1
950
Call a function with no arguments that just returns NIL: 1.00 1.01 1.66 6.29 3.30 2.68
Call a function with one argument that just returns its argument: 1.00 1.01 1.70 6.58 3.31 2.85
Call a function with one argument that just does an AREF on a simple-vector: 1.00 1.72 3.14 12.95 6.60 6.35
Call a function with one argument that just does an AREF on a string: 1.00 1.82 3.35 13.94 7.09 6.80
Call a function with one argument that just does an SVREF on a simple-vector: 1.00 1.02 3.09 14.85 7.36 6.40
Call a default method (the only method for the generic) with one argument: 1.00 1.62 1.40 7.16 3.34 3.13
Call a generic function with one method with one argument: a standard-object: 1.00 1.63 1.42 7.10 3.32 3.11
Call a generic function with three methods with one argument: a standard-object: 1.00 1.64 1.36 7.13 3.33 3.11
Call a generic function with three methods with one argument, a fixnum: 1.00 1.58 2.01 8.96 4.19 4.01
Call a reader method (the only method for the generic) with one argument: 1.00 2.49 1.47 7.04 3.03 2.92
Call a writer method (the only method for the generic) with two arguments: 1.00 2.52 1.34 7.32 3.06 3.07
Call one EQL-specialized method out of 1: 1.00 1.42 1.02 5.16 2.55 2.57
Call default method after missing one EQL-specialized method out of 1: 1.00 1.42 1.04 4.95 2.41 2.44
Call one EQL-specialized method out of 10: 1.00 1.41 1.15 6.93 3.25 3.28
Call default method after missing one EQL-specialized method out of 10: 1.00 1.50 1.39 8.88 4.06 4.15
Call one EQL-specialized method out of 100: 1.00 1.58 2.12 18.87 8.59 8.62
Call default method after missing one EQL-specialized method out of 100: 1.00 1.64 2.66 23.96 14.90 13.33
Call one EQL-specialized multimethod out of 10: 1.00 1.46 0.98 5.68 2.61 2.62
Call default method after missing one EQL-specialized multimethod out of 10: 1.00 1.52 1.14 7.04 3.18 3.21
Call the same method (out of 100) one hundred times: 1.00 1.82 2.63 10.26 5.12 4.99
Call one hundred different methods: 1.00 1.73 3.34 9.08 4.86 5.06
Call the same generic function with one method one hundred times: 1.00 1.78 2.63 10.74 5.38 5.23
Call one hundred different generic functions each with one method: 1.00 1.81 4.02 10.42 6.03 5.92
Call a two-argument-specialized method (the less specific of two on the generic function): 1.00 1.36 0.90 4.39 2.06 1.95
Call a two-argument-specialized method (the more specific of two on the generic function): 1.00 1.31 1.00 4.48 2.09 1.84
Call an ordinary function with five arguments: 1.00 1.00 1.72 9.55 4.32 4.48
Call a generic function with five arguments: method specializes all five: 1.00 1.37 0.83 4.25 1.91 1.85
Call a generic function with five arguments: last arg leads to default method: 1.00 1.38 0.95 4.60 2.09 2.05
Call an ordinary function with ten arguments: 1.00 1.01 1.65 9.97 4.66 4.80
Call a generic function with ten arguments: method specializes all ten: 1.00 1.37 0.79 4.20 1.88 1.80
Call a generic function with ten arguments: last arg leads to default method: 1.00 1.38 0.85 4.42 1.97 1.92
Call a generic function with one method with one argument and read one slot: 1.00 1.38 2.80 11.92 5.06 4.62
Call a generic function with one method with one argument that calls a reader method: 1.00 2.27 1.60 7.49 3.44 3.31
Call a generic function with one method with two arguments and write one slot: 1.00 1.38 1.97 8.55 3.90 3.46
Call SLOT-VALUE not in a method: 1.00 1.03 4.12 15.87 7.70 6.86
Call a lexical closure created by a method: 1.00 1.06 2.77 10.82 5.41 5.15
Read a slot in a lexical closure created by a method: 1.00 1.05 3.92 13.86 6.77 6.19
Call SLOT-VALUE not in a method to read first slot of thirty: 1.00 1.04 4.11 15.84 7.68 6.87
Call SLOT-VALUE not in a method to read last slot of thirty: 1.00 1.01 2.52 12.41 5.43 5.17
CLASS-OF a standard-object: 1.00 2.96 4.41 14.88 7.94 7.00
CLASS-OF a fixnum: 1.00 2.32 4.98 15.08 8.13 7.63
Call a shared slot reader method (the only method for the generic) with one argument: 1.00 2.23 1.83 8.30 3.57 3.38
Call a shared slot writer method (the only method for the generic) with two arguments: 1.00 2.33 1.47 7.73 3.28 3.25
Call a generic function with one method with one argument and read one shared slot: 1.00 1.34 2.65 12.06 4.96 4.59
Call a generic function with one method with one argument and write one shared slot: 1.00 1.32 1.53 8.77 3.78 3.41
Call SLOT-VALUE of a shared slot not in a method: 1.00 1.02 3.59 14.54 6.88 6.32
MAKE-INSTANCE of a constant class with two slots and no initialization methods: 1.00 1.06 6.22 14.93 7.33 7.78
MAKE-INSTANCE of a constant class with four slots and no initialization methods: 1.00 1.05 5.48 13.57 6.70 7.04
MAKE-INSTANCE of a constant class with four slots and one initialization method: 1.00 1.08 5.38 12.94 6.39 6.61
MAKE-INSTANCE of a variable class by name with two slots and no initialization methods: 1.00 1.10 6.39 13.52 6.76 7.24
MAKE-INSTANCE of a variable class by object with two slots and no initialization methods: 1.00 1.04 6.11 15.12 7.31 7.92
SLOT-UNBOUND trap for a local slot accessed from a method: 1.00 1.51 2.22 8.94 4.11 3.77
SLOT-UNBOUND trap for a local slot accessed from a reader: 1.00 1.84 1.29 5.96 2.74 2.62
SLOT-UNBOUND trap for a local slot accessed from SLOT-VALUE: 1.00 1.45 2.28 9.18 4.36 3.96
SLOT-UNBOUND trap for a shared slot accessed from a method: 1.00 1.62 2.12 8.66 3.97 3.68
SLOT-UNBOUND trap for a shared slot accessed from a reader: 1.00 1.85 1.27 5.98 2.75 2.62
SLOT-UNBOUND trap for a shared slot accessed from SLOT-VALUE: 1.00 1.59 2.27 8.85 4.19 3.82
Call a generic function with one applicable method: a primary: 1.00 1.63 1.37 7.10 3.32 3.11
Call a generic function with two applicable primary methods: only one runs: 1.00 1.87 1.52 7.28 3.35 3.00
Call a generic function with two primary (one runs) one before method: 1.00 1.10 1.72 8.91 3.95 3.95
Call a generic function with two primary (one runs) one before one after method: 1.00 1.19 1.73 7.43 3.44 3.48
Call a generic function with one around one primary method: 1.00 1.10 1.78 8.33 3.44 3.25
Call a generic function with one around one primary one before method: 1.00 1.20 2.07 10.69 4.39 4.09
Call a generic function with one around one primary one before one after method: 1.00 1.27 1.93 9.52 4.01 3.81
Call a generic function with two around two primary (one runs) two before two after methods: 1.00 1.07 2.04 9.31 4.02 3.92
Call a generic function with two around three primary (two run via call-next-method) two before two after methods: 1.00 1.09 2.04 9.72 4.28 4.17

Benchmark Details: BIGNUM
The BIGNUM benchmarks were obtained by:
(time (factorial 1000))

Benchmark Details: Scrolling
The scrolling benchmarks are the total time taken to scroll a 2000 line file from top to bottom and then from bottom to top.
MCL-PPC
4.0
9500
MCL-PPC
3.9
9500
MCL-68k
3.0p2k2
9500
MCL-68k
3.0p2k2
7100
MCL-6k8
3.0p2k2
950
MCL-68k
2.0.1
950
Scrolling down
1.00 1.22 1.83 4.35 2.28 1.79
Scrolling up
1.00 1.14 1.77 4.42 2.33 2.02

Benchmark Details: Search files
The search files benchmarks were obtained by
(time (ccl::do-dialog-file-search "HD:Examples:*.lisp" "MCL"))

where HD:Examples contains 1.1 megs of lisp code in 82 files.


Benchmark Details: Graphics
For the graphics benchmark, the following function from turtles.lisp (in the Examples folder) was executed.
(defparameter *t1* (make-instance 'turtles::turtle)) (time (dotimes (i 12) (turtles::right *t1* 30) (turtles::hexagon *t1* 30)))  

Benchmark Details: Compile and load 32 files
In this benchmark, 32 files from a large project were compiled and loaded. Since the loading step is largely I/O bound, a single comprehensive benchmark statistic for each machine may be misleading. Thus to more accurately rate the relative performatce of MCL-PPC, the benchmark was further broken down as follows:
MCL-PPC
4.0
9500
MCL-PPC
3.9
9500
MCL-68k
3.0p2k2
9500
MCL-68k
3.0p2k2
7100
MCL-6k8
3.0p2k2
950
MCL-68k
2.0.1
950
Compile 32 files
1.00 1.16 3.07 3.68 1.99 -
Compile and load 32 files
1.00 1.17 3.15 3.58 1.99 -
Load 32 files
1.00 1.25 3.71 2.77 1.94 -

(The MCL 2.0.1 entry is missing because the project was written for MCL 3.0 and up.)


Made with MCL MCL and Macintosh Common Lisp are trademarks of Digitool, Inc.
Apple, the Apple logo, and Macintosh are trademarks of Apple Computer.
All other trademarks mentioned herein belong to their respective owners.
Last update: Sat, Mar 06 1999 at 16:35:26
Copyright © 2000
Digitool, Inc.
Web design by
David & Nick
Lamkins