On Aug 28, 10:57 pm, Chas Emerick <cemer...@snowtide.com> wrote:
> In the course of doing some profiling tonight, I hit on a hotspot in
> some particularly multimethod- and isa?-heavy code. It didn't take me
> long to find that the bases and supers support fns for isa? were at
> the root of the issue, with bases in particular taking more time in
> aggregate than the bodies of the multimethods themselves.
>
> A quick fix for this was to memoize bases and supers. Given that
> these fns are concerned only with Classes (and not the dynamic
> hierarchies, etc), this would seem to be safe in general. The
> benefits are compelling (times given for a single invocation of a
> particular lazily-recursive multimethod):
>
> Baseline, no memoization: 17165ms
> After memoizing supers: 2874ms
> After memoizing supers & bases: 2749ms
>
> That's a big factor difference, and in aggregate, the impact would be
> quite huge.
>
> Memoizing bases is strictly redundant w.r.t. optimizing the use of
> isa?, as isa? only calls supers. However, assuming the safety of this
> approach, there's no harm in memoizing bases as well for those fns
> that do use it (like parents).
>
> I'd presume that a memoization that uses a WeakHashMap in the
> background would be far preferable to the built-in memoize fn in core
> now -- this would allow unloaded Classes to be dropped from the cache
> appropriately. Further, Class doesn't override hashCode or equals
> itself, so memoizing these fns should allow for multiple instances of
> the same Class (e.g. from different classloaders) to peacefully coexist.
>
> Given that, it seems to me that this approach is safe, at least with
> what I know about module systems, and the other factors associated
> with classloading, etc. There's the wildcard of what's going on in
> the JDK 7 future, but I can't usefully talk about that.
>
> Thoughts?
Since multimethods (are supposed to) cache their lookup *results*
(i.e. they shouldn't lookup over and over), I wouldn't expect this to
yield any improvement in a stable system with reused call paths. Are
you calling isa? yourself? Can you please paste some example code that
demonstrates the issue?
Rich
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---