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
-~----------~----~----~----~------~----~------~--~---

Reply via email to