You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bu...@apache.org on 2010/12/13 10:40:32 UTC

DO NOT REPLY [Bug 50200] VectorSet kills the performance of DirectoryScanner

https://issues.apache.org/bugzilla/show_bug.cgi?id=50200

--- Comment #1 from Stefan Bodewig <bo...@apache.org> 2010-12-13 04:40:28 EST ---
I'm afraid your patch relies on Vector's implementation details which are not
documented.  Let's assume Vector's add() method was implemented like

public synchronized boolean add(Object o) {
    add(size(), o);
    return true;
}

then invoking VectorSet#add(Object) would add the object to the set, invoke
super.add(Object) which in turn invokes VectorSet#add(int,Object) getting back
to doAdd(int,Object) which will then not add the object at all because
it already is inside the set.

The real problem seems to be that we perform arraycopy even if we don't need
to in the index==size() case so I wonder whether a patch like

Index: src/main/org/apache/tools/ant/util/VectorSet.java
===================================================================
--- src/main/org/apache/tools/ant/util/VectorSet.java   (revision 1040588)
+++ src/main/org/apache/tools/ant/util/VectorSet.java   (working copy)
@@ -77,12 +77,14 @@
         // is not documented so we may better implement it ourselves
         if (set.add(o)) {
             ensureCapacity(size() + 1);
+            if (index != size()) {
             Object[] elems = new Object[elementData.length];
             System.arraycopy(elementData, 0, elems, 0, index);
-            elems[index] = o;
             System.arraycopy(elementData, index, elems, index + 1,
                              size() - index);
             elementData = elems;
+            }
+            elementData[index] = o;
             elementCount++;
         }
     }

wouldn't achive the same performance improvement without inoking any base class
methods at all.

Is there any chance you could check my suggested patch in your environment?

-- 
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.