[armedbear-devel] Profiling ABCL exception handling

Erik Huelsmann ehuels at gmail.com
Sat Nov 6 18:24:38 UTC 2010


Yesterday, I started playing around with JRockit's MissionControl
tool, now that we run on JRockit.

One of the (quite surprising) findings was that we generated over 1.3
million ClassNotFoundExceptions during the compilation of Maxima. With
two simple changes nearly all of those have been removed.

There are still quite a few exceptions associated with our loading
process though, as our ZipCache seems to trigger integer parsing
exceptions in URLs internally; from the names of the functions through
which the exceptions are being found, it looks like Java wants to
parse IPv4-dot-separated tuples as host names. Our URLs don't have
hostnames most of the time: we're passing file:// URLs!

Running an exception profile on Maxima running its test suite shows
lots of non-local transfer of control exceptions: Return, Go and
Throw: during a run of ca 10 minutes, I'm finding 5.5 million
exceptions being thrown which - as MissionControl calculated for me -
should mean an average of little over 12k/s. I guess that's kind of
expected with our strategy for non-local transfers of control.
However, if rethrows are counted as well, we can probably do better:
by minimizing the number of try/catch blocks in our compiled code
which reset special bindings.

To illustrate what I mean, the example

"""
(declaim (special *x*))
(defun foo (*X*) (let ((*X* 1)) (let ((*X* 2)) 0)))
"""

Decompiles into (pseudo code):

foo(*X*):
   function_setup_code
   reg1 = current_specials_state()
   try {
     bind_special(*X*, arg1)
     reg2 = current_specials_state()
     try {
       bind_special(*X*, 1)
       reg3 = current_specials_state()
       try {
        bind_special(*X*, 2)
        reg4 = integer_0
       }
       catch (Throwable t) {
          reset_specials_state(reg3)
          rethrow t
       }
       reset_specials_state(reg3)
     }
     catch (Throwable t) {
      reset_specials_state(reg2)
      rethrow t
     }
     reset_specials_state(reg2)
   }
   catch (Throwable t) {
     reset_specials_state(reg1)
     rethrow t
   }
   reset_specials_state(reg1)
   return reg4


As you see, to handle a single non-local transfer of control, we throw
and catch the same exception 3 times. This issue is known as ticket
#90 (http://trac.common-lisp.net/armedbear/ticket/90).

It would be really nice to hash through all the different situations
which may need special-bindings-state to be reset with a few of you
and resetting *only* those cases. I'm hoping our general performance -
and the Maxima-on-ABCL performance because of its many special
variables in particular. BTW: ABCL came from the situation where it
tried to use that scheme, but the way it was implemented made it
really hard to find out where specials were leaking - and they were.



Bye,


Erik.




More information about the armedbear-devel mailing list