Bug 53822

Summary: performance of IdentityStack.containsAll()
Product: Ant Reporter: Adrian Nistor <nistor1>
Component: CoreAssignee: Ant Notifications List <notifications>
Status: RESOLVED FIXED    
Severity: normal CC: nistor1
Priority: P2 Keywords: PatchAvailable
Version: 1.9.1   
Target Milestone: 1.9.4   
Hardware: PC   
OS: Linux   
Attachments: patchSmall.diff
patchFull.diff
test

Description Adrian Nistor 2012-09-03 18:45:37 UTC
Created attachment 29322 [details]
patchSmall.diff

"IdentityStack.containsAll(Collection coll)" has a similar performance
problem as the previously fixed Bug 53622 (for
"VectorSet.retainAll(Collection coll)").  The problem is that
"containsAll(Collection coll)" performs "this.contains(e.next())",
which is slow because "this" is an IdentityStack, i.e., a Vector, and
therefore "contains" is linear.

I attached a patch (patchSmall.diff) similar to the one used by Jesse
Glick in Bug 53622.  I attached an improved patch (patchFull.diff)
that builds the IdentityHashMap lazily, which gives slightly better
performance than patchSmall.diff (which builds IdentityHashMap
eagerly).  I also attached a test that exposes this problem.  For this
test, patchSmall.diff provides a 676X speedup on my machine.

To run the test, just do:

$ java Test

The output for the un-patched version is:
Time is 17572

The output for the patched version is:
Time is 26
Comment 1 Adrian Nistor 2012-09-03 18:45:58 UTC
Created attachment 29323 [details]
patchFull.diff
Comment 2 Adrian Nistor 2012-09-03 18:46:29 UTC
Created attachment 29324 [details]
test
Comment 3 Stefan Bodewig 2014-01-02 14:38:11 UTC
svn revision 1554813