[ 
https://issues.apache.org/jira/browse/COLLECTIONS-302?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12642451#action_12642451
 ] 

Joachim Rudolph commented on COLLECTIONS-302:
---------------------------------------------

I did some tests myself, I just underestimated the speed of System.arraycopy()

In my problem the resulting collection would be almost empty. 
For this case the following code models the algorithm :

{code:title=Bar.java|borderStyle=solid}
    private static final int REPS = 50;
    @SuppressWarnings("unchecked")
    public static void test(int n) throws InterruptedException {
        Collection a = new ArrayList(n);
        for(int i=0; i<n; i++) {
            a.add("bob"+i);
        }
        
        for (int r = 0; r < REPS; ++r) {
            ArrayList c = new ArrayList(a);
            long t1 = System.currentTimeMillis();
            while( c.size() > 0 ){
                c.remove(0);
            }
            long t2 = System.currentTimeMillis();
            System.err.println("T" + n + ": " + (t2-t1)+ " ms");
        }
    }
{code} 

In this testcase for n = 200000, System.arraycopy() is called 200000 times with 
an average of 100000 references to be moved.
The code runs on my machine within 12.3 seconds/iteration which is about 6.5 
GBytes/sec, much better than I expected.
So I will use Arraylists on many other problems where I was worried about the 
O(N^2) performance before.

I should have done my profiling before... sorry.




> CollectionUtils.subtract() should not use ArrayList to improve speed
> --------------------------------------------------------------------
>
>                 Key: COLLECTIONS-302
>                 URL: https://issues.apache.org/jira/browse/COLLECTIONS-302
>             Project: Commons Collections
>          Issue Type: Improvement
>          Components: Collection
>            Reporter: Joachim Rudolph
>            Priority: Minor
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> The implementation of version 3.2.1 is
> public static Collection subtract(final Collection a, final Collection b) {
>         ArrayList list = new ArrayList( a );
>         for (Iterator it = b.iterator(); it.hasNext();) {
>             list.remove(it.next());
>         }
>         return list;
>     }
> when a and b are large and similar the subtract implementation will call 
> ArrayList.remove() frequently which copies a potentially large part of the 
> list using system.arraycopy.
> Suggestion : use LinkedList ( at least for large lists )

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to