On Fri, 2003-03-14 at 19:00, Alex Chaffee / Purple Technology wrote:
> On Fri, Mar 14, 2003 at 12:34:56PM +0000, Henning P. Schmiedehausen wrote:
> > Henri Yandell <[EMAIL PROTECTED]> writes:
> > 
> > >Is there any reason why split/join are special?
> > 
> > I need them. :-) And splitting at a single char / joining with a
> > single char as delimiter is needed very often and using '.' is more
> > efficient than "."
> 
> I believe you, but I prefer clean interfaces to performance
> optimizations.  If you run a quick performance test -- compare
> splitting and joining, say, a 10-item and a 10000-item list both by
> char and by String -- and post the results (or add them to the bug
> report) it might help make your case.


Without my patch:

What                            10 items        10.000 item     100.000 item
Iterations                      10000           100             100

join(Object[], String sep)      91 millis       478 millis      13939 millis
join(Iterator, String sep)      87 millis       977 millis      27737 millis
join(Object[], null)            44 millis       518 millis      13628 millis
join(Iterator, null)            74 millis       935 millis      22989 millis

With my patch:

What                            10 items        10.000 item     100.000 item
Iterations                      10000           100             100

join(Object[], String sep)      92 millis       480 millis      13801 millis
join(Iterator, String sep)      87 millis       981 millis      27774 millis
join(Object[], char sep)        40 millis       387 millis      13070 millis
join(Iterator, char sep)        71 millis       931 millis      27114 millis
join(Object[], null)            33 millis       337 millis      12498 millis
join(Iterator, null)            61 millis       800 millis      21756 millis

So the "char" operations are quite a bit faster especially with short array
lengths. The join operation with null separator has been speeded up quite a
bit (and concatenate() does map now on this).

So please, apply the patch. :-)

Test suite attached.

        Regards
                Henning


-- 
Dipl.-Inf. (Univ.) Henning P. Schmiedehausen          INTERMETA GmbH
[EMAIL PROTECTED]        +49 9131 50 654 0   http://www.intermeta.de/

Java, perl, Solaris, Linux, xSP Consulting, Web Services 
freelance consultant -- Jakarta Turbine Development  -- hero for hire
import java.util.ArrayList;
import java.util.Iterator;

import org.apache.commons.lang.StringUtils;

public class SpeedTest
{
    public static void main(String [] args)
    {
        if (args.length < 2)
            System.exit(1);

        SpeedTest st = new SpeedTest(args[0], args[1]);

        st.run();
    }

    private int splitsize = 0;

    private int loops = 0;

    private long startTime, endTime;

    private String [] foo;
    private ArrayList al;

    public SpeedTest(String splitSize, String loops)
    {
        this.splitsize = Integer.parseInt(splitSize);
        this.loops     = Integer.parseInt(loops);
    }

    public void run()
    {
        System.out.println("Starting up...");

        foo = new String[splitsize];
        al = new ArrayList();

        for (int i = 0 ; i < splitsize; i++)
        {
            foo[i] = "demostring";
            al.add("demostring");
        }


        runObjStr();
        System.gc();
        runIterStr();
        System.gc();

        runObjChar();
        System.gc();
        runIterChar();
        System.gc();

        runObj();
        System.gc();
        runIter();

    }

    private void runObjStr()
    {
        System.out.println("Running " + loops + " iterations of join(Object[], String separator)");
        
        startTime = System.currentTimeMillis();

        for (int i = 0 ; i < loops; i++)
        {
            String newString = null;

            newString = StringUtils.join(foo, ".");
        }

        endTime = System.currentTimeMillis();

        System.out.println("Took " + (endTime - startTime) + " Millisec.");
    }

    private void runIterStr()
    {
        System.out.println("Running " + loops + " iterations of join(Iterator, String separator)");
        
        startTime = System.currentTimeMillis();

        for (int i = 0 ; i < loops; i++)
        {
            String newString = null;

            newString = StringUtils.join(al.iterator(), ".");
        }

        endTime = System.currentTimeMillis();

        System.out.println("Took " + (endTime - startTime) + " Millisec.");
    }

    private void runObj()
    {
        System.out.println("Running " + loops + " iterations of join(Object[], null)");
        
        startTime = System.currentTimeMillis();

        for (int i = 0 ; i < loops; i++)
        {
            String newString = null;

            newString = StringUtils.join(foo, null);
        }

        endTime = System.currentTimeMillis();

        System.out.println("Took " + (endTime - startTime) + " Millisec.");
    }

    private void runIter()
    {
        System.out.println("Running " + loops + " iterations of join(Iterator, null)");
        
        startTime = System.currentTimeMillis();

        for (int i = 0 ; i < loops; i++)
        {
            String newString = null;

            newString = StringUtils.join(al.iterator(), null);
        }

        endTime = System.currentTimeMillis();

        System.out.println("Took " + (endTime - startTime) + " Millisec.");
    }

    private void runObjChar()
    {
        System.out.println("Running " + loops + " iterations of join(Object[], char separator)");
        
        startTime = System.currentTimeMillis();

        for (int i = 0 ; i < loops; i++)
        {
            String newString = null;

            newString = StringUtils.join(foo, '.');
        }

        endTime = System.currentTimeMillis();

        System.out.println("Took " + (endTime - startTime) + " Millisec.");
    }

    private void runIterChar()
    {
        System.out.println("Running " + loops + " iterations of join(Iterator, char separator)");
        
        startTime = System.currentTimeMillis();

        for (int i = 0 ; i < loops; i++)
        {
            String newString = null;

            newString = StringUtils.join(al.iterator(), '.');
        }

        endTime = System.currentTimeMillis();

        System.out.println("Took " + (endTime - startTime) + " Millisec.");
    }


}
            

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to