From: rharris@ptolemy2.rdrc.rpi.edu (Richard Harris)
Subject: August 28 PCL
Organization: Rensselaer Polytechnic Institute, Troy, NY
Date: Sat, 29 Aug 1992 02:55:29 GMT


I have just placed a new version of PCL on parcftp.xerox.com, in the
directory /pub/pcl, named August-28-92-PCL.tar.Z.  The file 
August-28-92-Systems.tar.Z contains PCL, CLX R5, and an inspecter.
Unless your system already includes a good inspecter, I recommend using
this one.

This version has been tested in Lucid CL 4.0.1 and in CMUCL 16e.

This version has extensive make-instance optimizations: make-instance
should run faster in every case, much faster for instances with many slots, 
and fastest for make-instance calls with constant keyword arguments appearing
within methods or inside a PCL::EXPANDING-MAKE-INSTANCE-TOP-LEVEL form.
Furthermore, there is essentially no overhead for keyword argument checking in
make-instance or reinitialize-instance.

Here is an example of how to get the fastest make-instance:
(Note that calls to make-instance from within defmethods are automatically
optimized.)

(pcl::expanding-make-instance-top-level
(defun n-make-variable-initargs1 (N)
  ;; Much slower than n-make! -- Not true in this PCL!
  (let ((x 0) (y 5))	
    (operations-per-second (make-instance 'point :x x :y y) n)))
)

According to the bench-this-clos benchmark, this version is faster
than March 92 PCL 2c for everything except default method only calls.
The reason it is slower there is because method functions have a special
calling protocol (see MAKE-METHOD-LAMBDA in The Art of the MetaObject 
Protocol).

I ran the benchmark on a sun4 (but I don't know which model),
using Lucid's Sun Common Lisp 4.0.1.  (This is the bench-this-clos code 
that was posted to comp.lang.lisp by jmorrill@bbn.com a few days ago;
It is included as the file bench.lisp.)

These numbers are in operations per second.

                                   March 92 2c        Aug 28
1 default method:                  980392.1568627451  301204.8192771085
1 dispatch, 1 method:              168918.91891891894 226244.34389140274
1 dispatch, :around + primary:      42337.00254022015 118764.84560570072
1 dispatch, 3 methods, instance:   120192.3076923077  171821.30584192442
1 dispatch, 3 methods, noninstance: 78003.12012480499 148809.52380952382
2 dispatch, 2 methods:              85324.23208191127 132978.72340425532
slot reader method:                226244.34389140274 284090.9090909091
with-slots (1 access):             108459.86984815619 114678.89908256881
with-slots (1 modify):              89928.05755395684 113378.68480725623
naked slot-value:                  144508.67052023122 231481.4814814815
class-of instance:                 207468.8796680498  657894.7368421053
class-of noninstance:               95969.28982725527 221238.93805309737
allocate-instance (2 slots):        12543.90366281987  14343.08663224326
unoptimized make-instance
make-instance (2 slots):             2514.331690636629  3051.3853289393387
make-instance (2 constant initargs): 2274.1744746656964 2327.09671413944
make-instance (2 variable initargs): 2274.1744746656964 2327.09671413944
optimized make-instance
make-instance (2 slots):                               13564.839934888769
make-instance (2 constant initargs):                   12543.90366281987
make-instance (2 variable initargs):                   12543.90366281987


  Richard Harris
Xref: sparky comp.lang.clos:775 comp.object:3397