At least I'm willing to admit it... :)

-David


On Jun 10, 2010, at 2:18 AM, Adrian Crum wrote:

> My point was made since the beginning of the original thread. Javolution 
> might not be the best choice in all situations. Let's discuss that.
> 
> As far as I can tell, no one here is thumping their chest. Adam asked a 
> legitimate question. I pointed to an informative article related to his 
> question. We discussed the premise of that article. I thought it would be 
> helpful for the community to discuss it further. Scott asked for more 
> information and I offered it. If any chest thumping was done, it was in your 
> last reply.
> 
> -Adrian
> 
> --- On Thu, 6/10/10, David E Jones <d...@me.com> wrote:
> 
>> From: David E Jones <d...@me.com>
>> Subject: Re: Discussion: When To Use Javolution (was: EntityCondition 
>> factory objects)
>> To: dev@ofbiz.apache.org
>> Date: Thursday, June 10, 2010, 1:08 AM
>> 
>> I'm sure there are good references around with a more
>> complete list of differences. Be careful about pushing some
>> differences and leaving out others, especially when bias is
>> involved (ie arrays are better than linked lists). It may be
>> that in some circumstances iterating is faster, but if so
>> probably not by much (ie the difference between following a
>> pointer versus incrementing an index).
>> 
>> There are some things that linked lists do far better (like
>> sorting, and most modifications actually), and if not
>> intentionally optimized they can actually require more
>> memory instead of less for smaller lists.
>> 
>> To Scott's point... what (again) was the point of all of
>> this? I guess it's always fun to thump one's chest and
>> demonstrate knowledge of the concepts behind basic data
>> structures, but most of this stuff fits into freshman
>> computer science material, so even that isn't so much fun s
>> not many people will be impressed.
>> 
>> To your point Adrian, this stuff is definitely an issue,
>> but unless you're looking at a specific piece of code and
>> you actually profile to test alternatives it's really quite
>> difficult to guess at what is better. 
>> 
>> That's part of the fun of profiling, the moment you find
>> you were wrong is roughly the same moment when you find out
>> what is right, even if it's often not what you expected.
>> There are very few activities in life where those two events
>> occur so close together... so it makes it kind of fun and
>> only occasionally frustrating instead of the other way
>> around... ;)
>> 
>> -David
>> 
>> 
>> On Jun 10, 2010, at 1:49 AM, Adrian Crum wrote:
>> 
>>> Oops, I forgot to explain iteration differences.
>> Iterating over an array is faster than traversing a
>> doubly-linked list.
>>> 
>>> -Adrian
>>> 
>>> --- On Thu, 6/10/10, Adrian Crum <adrian.c...@yahoo.com>
>> wrote:
>>>> I backed it up in an indirect way by
>>>> mentioning the need to understand the Javolution
>> library and
>>>> its intended use. Go here to find out more:
>>>> 
>>>> http://javolution.org/
>>>> 
>>>> To summarize: Javolution was intended to be used
>> in
>>>> real-time systems where timing is critical. The
>> library's
>>>> goal is timing that is *consistent*, not
>> necessarily fast.
>>>> 
>>>> OFBiz is not a real-time application - it isn't
>> being used
>>>> to control robots or Mars rovers or anything
>> timing-critical
>>>> like that.
>>>> 
>>>> You have to spend time on the Javolution site and
>> poke
>>>> around in their code a bit to understand the
>>>> advantages/disadvantages. Adam has mentioned some
>> of them in
>>>> this thread and in previous threads.
>>>> 
>>>> FastList implements a doubly-linked list. The list
>> nodes
>>>> are kept in an object pool. ArrayList wraps an
>> array. If you
>>>> think about it, the advantages/disadvantages will
>> start to
>>>> become evident. FastList will perform additions
>> and removals
>>>> more consistently than ArrayList because the
>> change involves
>>>> adding/removing a node. ArrayList resizes/copies
>> the array
>>>> it wraps, so the timing depends on the size of the
>> array. A
>>>> doubly-linked list will take more memory than
>> ArrayList
>>>> because the list elements are wrapped with nodes.
>> An
>>>> ArrayList will take more memory than the array it
>> wraps
>>>> because it contains additional bookkeeping data.
>>>> 
>>>> -Adrian
>>>> 
>>>> 
>>>> --- On Wed, 6/9/10, Scott Gray <scott.g...@hotwaxmedia.com>
>>>> wrote:
>>>> 
>>>>> From: Scott Gray <scott.g...@hotwaxmedia.com>
>>>>> Subject: Re: Discussion: When To Use
>> Javolution (was:
>>>> EntityCondition factory objects)
>>>>> To: dev@ofbiz.apache.org
>>>>> Date: Wednesday, June 9, 2010, 11:56 PM
>>>>> Interesting post but what I'm not
>>>>> hearing is any mention of specific downsides
>> to using
>>>>> javolution in place of the util classes even
>> when the
>>>> use
>>>>> may not be taking advantage of any specific
>>>> javolution
>>>>> features.
>>>>> 
>>>>> You mention this:
>>>>>> There is no performance benefit to using
>> FastList
>>>> in
>>>>> this scenario. An ArrayList will use less
>> memory and
>>>> will
>>>>> perform faster than FastList - if its size is
>>>> initialized to
>>>>> the correct value. Better yet, if you know the
>> number
>>>> of
>>>>> objects in advance, then just create an
>> array.
>>>>> 
>>>>> But you provide no evidence to back the
>> statement
>>>> up. 
>>>>> And a FastList can also be given an initial
>> size.
>>>>> 
>>>>> I'm disagreeing with what you're saying
>> because I
>>>> really
>>>>> don't know much about it, but your post
>> doesn't really
>>>> do
>>>>> much to increase my knowledge or give me any
>> reason
>>>> to
>>>>> follow your advice.
>>>>> 
>>>>> Regards
>>>>> Scott
>>>>> 
>>>>> HotWax Media
>>>>> http://www.hotwaxmedia.com
>>>>> 
>>>>> On 10/06/2010, at 6:25 PM, Adrian Crum wrote:
>>>>> 
>>>>>> I'm continuing this discussion with a new
>>>> subject
>>>>> since the thread is starting to diverge from
>> the
>>>> original
>>>>> subject.
>>>>>> 
>>>>>> A lot of the current code uses Javolution
>> classes
>>>> in
>>>>> many places for one common reason -
>> copy-and-paste
>>>>> development. If you don't understand the
>> Javolution
>>>> library
>>>>> and its intended use and actual benefits then
>> it's
>>>> hard to
>>>>> know when the classes should be used and when
>> there
>>>> might be
>>>>> better alternatives.
>>>>>> 
>>>>>> When I see class names like FastList and
>> FastMap,
>>>> I
>>>>> assume using them will speed up code. Indeed,
>> some JRE
>>>> class
>>>>> methods will execute faster using Javolution
>> instead
>>>> of JRE
>>>>> classes, and those methods are well documented
>> on the
>>>>> Javolution website. If a bit of code doesn't
>> use any
>>>> of
>>>>> those methods, then there will be no benefit
>> to using
>>>>> Javolution.
>>>>>> 
>>>>>> Adam and I discussed earlier the use of
>> object
>>>> pools.
>>>>> Object pools used to improve performance
>> because they
>>>> helped
>>>>> cut down on garbage collection. Sun/Oracle
>> recommends
>>>>> getting rid of object pools when using the
>> newer
>>>> versions of
>>>>> Java because the newer versions have improved
>> garbage
>>>>> collectors.
>>>>>> 
>>>>>> If you do a Google search for "java
>> performance
>>>>> improvement" you'll get a lot of links to a
>> lot of
>>>> articles.
>>>>> From my experience a lot of those ideas are
>> based on
>>>> some
>>>>> special knowledge of how the JVM works and
>> they "game
>>>> the
>>>>> system" to improve performance. As a result,
>> some of
>>>> those
>>>>> optimizations depend on the JVM version and
>> the
>>>> platform it
>>>>> runs on.
>>>>>> 
>>>>>> My preference is to use efficient
>> algorithms and
>>>> well
>>>>> structured code, and leave the performance
>>>> optimizations to
>>>>> the JVM. I can give an example that will be
>> obvious
>>>> to
>>>>> everyone:
>>>>>> 
>>>>>> Let's say a section of code builds a List
>> of
>>>> objects
>>>>> and then iterates over the List. Once the List
>> is
>>>> created,
>>>>> its contents don't change - there are no
>> additions,
>>>>> removals, inserts, etc. In addition, this List
>> will be
>>>> a
>>>>> member of an object that is kept in a cache.
>>>>>> 
>>>>>> There is no performance benefit to using
>> FastList
>>>> in
>>>>> this scenario. An ArrayList will use less
>> memory and
>>>> will
>>>>> perform faster than FastList - if its size is
>>>> initialized to
>>>>> the correct value. Better yet, if you know the
>> number
>>>> of
>>>>> objects in advance, then just create an
>> array.
>>>>>> 
>>>>>> If an ArrayList is used, you can call the
>>>> trimToSize
>>>>> method after the List is filled to reduce the
>> memory
>>>> it
>>>>> uses. Better yet, convert it to an array to
>> reduce
>>>> memory
>>>>> use even more. A cached object that contains
>> an array
>>>>> instead of FastList will take less memory and
>> perform
>>>>> better.
>>>>>> 
>>>>>> So, the main idea is to think about how
>> the
>>>> collection
>>>>> is being used and then choose the best class
>> for it.
>>>> Don't
>>>>> assume a Javolution class will always perform
>> better.
>>>>>> 
>>>>>> By the way, I'm not pointing any fingers
>> or
>>>> talking
>>>>> down to anyone here. I've done the
>> copy-and-paste
>>>>> development myself. It's only recently that I
>> started
>>>> to
>>>>> scrutinize my choice of classes.
>>>>>> 
>>>>>> -Adrian
>>>>>> 
>>>>>> 
>>>>>> --- On Wed, 6/9/10, Adrian Crum <adrian.c...@yahoo.com>
>>>>> wrote:
>>>>>>> --- On Wed, 6/9/10, David E Jones
>>>>>>> <d...@me.com>
>>>>>>> wrote:
>>>>>>>> On Jun 9, 2010, at 4:56 PM, Adrian
>> Crum
>>>>> wrote:
>>>>>>>> 
>>>>>>>>> On 6/9/2010 3:44 PM, Adam
>> Heath
>>>> wrote:
>>>>>>>>>> Adrian Crum wrote:
>>>>>>>>>>> I remember when
>> Javolution
>>>> was
>>>>> first
>>>>>>> brought
>>>>>>>> into the project. The
>>>>>>>>>>> reason for adding it
>> was
>>>> better
>>>>>>> performance. I
>>>>>>>> was new to the project at
>>>>>>>>>>> the time, so I just
>> assumed
>>>> that
>>>>> was
>>>>>>> true.
>>>>>>>>>>> 
>>>>>>>>>>> Since then I have read
>> many
>>>> books
>>>>> and
>>>>>>> articles
>>>>>>>> on Java, and now I'm not
>>>>>>>>>>> sure that Javolution
>> is
>>>>> appropriate for
>>>>>>> this
>>>>>>>> project.
>>>>>>>>>> 
>>>>>>>>>> I've also had doubts
>> about
>>>>>>>> FastMap(javolution).  It
>> doesn't
>>>>> implement
>>>>>>>>>> ConcurrentMap; the
>> putIfAbsent
>>>> method
>>>>> it
>>>>>>> *does*
>>>>>>>> implement is not
>>>>>>>>>> completely defined.
>>>>>>>>>> 
>>>>>>>>>> FastSet/FastMap don't have
>> a
>>>> defined
>>>>>>> order. 
>>>>>>>> It appears to be linked,
>>>>>>>>>> when no Comparator is
>> used, but
>>>> that
>>>>> is not
>>>>>>> well
>>>>>>>> defined.
>>>>>>>>>> 
>>>>>>>>>> javolution itself is
>> supposed to
>>>> be
>>>>> defined
>>>>>>> as
>>>>>>>> being more consistent
>>>>>>>>>> in memory usage and
>>>> performance. 
>>>>> The
>>>>>>> library
>>>>>>>> says these are useful
>>>>>>>>>> when the target platform
>> is an
>>>>> embedded
>>>>>>>> environment.  However, ofbiz
>>>>>>>>>> is not really an
>> embedded-type
>>>>>>> application. 
>>>>>>>> The extra overhead that
>>>>>>>>>> javolution uses for
>> maintain
>>>> memory
>>>>> block
>>>>>>> areas
>>>>>>>> makes it very hard for
>>>>>>>>>> the jvm to do the new
>> fancy
>>>> escape
>>>>> analysis.
>>>>>>>>>> Lots of places in ofbiz
>> use
>>>>>>>> FastMap/List/Set.  They are
>> not useful,
>>>>>>>>>> however, in places that
>> only get
>>>>> populated
>>>>>>> at
>>>>>>>> startup, and never ever
>>>>>>>>>> changed thereafter. 
>> I've
>>>> started
>>>>> fixing
>>>>>>> some
>>>>>>>> of these use cases as I
>>>>>>>>>> spot them.
>>>>>>>>> 
>>>>>>>>> I've used arrays instead of
>> Lists in
>>>>> similar
>>>>>>> cases. We
>>>>>>>> really should have a discussion
>> about
>>>> this.
>>>>> Using
>>>>>>> Javolution
>>>>>>>> by default in a shotgun attempt
>> to
>>>> improve
>>>>> performance
>>>>>>> is
>>>>>>>> not a good strategy, in my
>> opinion.
>>>>>>>> 
>>>>>>>> I agree. If I understand correctly
>> are
>>>> you
>>>>> saying that
>>>>>>> the
>>>>>>>> move away from javolution will NOT
>> be
>>>> done as
>>>>> a
>>>>>>> shotgun
>>>>>>>> attempt to improve performance?
>>>>>>> 
>>>>>>> Correct. Any changes that are made
>> should be
>>>> for a
>>>>> good
>>>>>>> reason.
>>>>>>> 
>>>>>>> -Adrian
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> 
>> 
>> 
> 
> 
> 

Reply via email to