[jbosscache-dev] Notifier - performance optimization

Manik Surtani manik at jboss.org
Wed May 21 06:01:08 EDT 2008


My comments below:

On 20 May 2008, at 22:57, Mircea Markus wrote:

> Hi,
>
> There is place for some performance optimization with respect to the  
> notification mechanism, in the Notifier class:
> 1) there are defensive Maps being created for being passed in the  
> pre/post notifications, even if no listeners are registered.

Are you looking at trunk?  I can see that the defensive copy is only  
made *after* checking for whether a listener exists.

E.g., in notifyNodeModified():

       	if (listeners != null && !listeners.isEmpty())
       	{
	         boolean originLocal = ctx.isOriginLocal();
         	 Map dataCopy = copy(data, useMarshalledValueMaps);
		... etc ...
	}

> 2) even if we do not have listeners for a certain event, there is  
> still a lookup in the listeners map to check for the available list  
> of listeners

Yes, you mean, for example,

       List<ListenerInvocation> listeners =  
listenerInvocations.get(NodeModified.class);

in notifyNodeModified().

Since we have a finite set of callbacks, I don't mind these lists  
becoming members as you suggested.  The only thing is, they should be  
final and never null, since they need to be threadsafe.  Constructing  
them lazily will become a problem without synchronizations.

> Optimizations:
> for 1) - do not trigger a notification if no listener registered,  
> use a guard - similar to log.isTraceEnabled()
> for 2) - rather than keeping a map with listeners registered for  
> each annotation type, rather keep the listeners list as a member -  
> this way we'll skip the list lookup.
>
> Another thing that just come into my mind is not iterating on the  
> list of listeners but rather use sequential access - small gain  
> though.

Well - looking at the implementation of a CopyOnWriteArrayList's  
iterator, it is nothing but sequential access.  The only gain would be  
saving the construction of the iterator object and in wrapping array  
accesses in a method (iterator.next()).  For the sake of readability  
though I'd rather stick with the foreach loop.

> I expect this would gain us some performance, especially in the  
> standalone mode.
> WDYT?
>
> Cheers,
> Mircea
> _______________________________________________
> jbosscache-dev mailing list
> jbosscache-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jbosscache-dev

--
Manik Surtani
Lead, JBoss Cache
manik at jboss.org









More information about the jbosscache-dev mailing list