Hi,

I've been facing various slowness issues recently, which led me to play
with profilers.  Today, I profiled Guile-RPC's XDR encoding routine with
`statprof' and got this:

  %     cumulative   self             
  time   seconds     seconds      name
    9.66     12.64     12.64  not
    6.57      9.38      8.59  xdr-basic-type-type-pred
    6.53      9.44      8.54  xdr-basic-type-size
    5.62      8.26      7.36  xdr-basic-type-encoder
    5.11      8.93      6.68  xdr-basic-type?
    3.69      4.83      4.83  eq?
  [...]
  Total time: 130.8 seconds (2147/100 seconds in GC)

Twelve seconds are being spent in `not', 5 seconds in `eq?', and 8
seconds in each record accessor (all of which could be implemented in a
few machine instructions).

So I went ahead and removed the `not' within the loop, rewriting
`(if (not c) a b)' to `(if c b a)', and voilà:

  %     cumulative   self             
  time   seconds     seconds      name
    8.88      1.19      1.08  xdr-basic-type-size
    5.14      0.74      0.62  xdr-basic-type-type-pred
    4.21      0.68      0.51  xdr-basic-type-encoder
    3.74      1.64      0.45  +
    3.74      0.45      0.45  eq?
  [...]
  Total time: 12.11 seconds (167/100 seconds in GC)

An order of magnitude faster!  I suppose that, as a side effect, the GC
needed to run less often because the evaluator was producing less
garbage.

Conclusions:

  1. When writing code for an interpreter, one has to be prepared for
     insignificant things taking surprisingly large amounts of time.  :-)

  2. My inlining patch [0] was not too irrelevant, I suppose.

  3. Upon user request, we may also want to allow the memoizer of `if'
     to automatically rewrite expressions of the form `(if (not c) ...)'.

Cheers,
Ludo'.

[0] http://thread.gmane.org/gmane.lisp.guile.devel/6043



_______________________________________________
Guile-devel mailing list
Guile-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/guile-devel

Reply via email to