All right. I ran a few tests to see how well (or badly) HttpClient measures up to the 
performance if HttpURLConnection shipped with JRE1.4 (v1.4.2.3)

Test platform: Win2k (PIII 512MB) + Tomcat 4.1.29 (JDK1.4.2.3 Xms128M Xmx256M) running 
locally
Test code attached below

There are the results

======================================================================
HttpClient 2.0.1 vs HttpURLConnection 1.4.2

(Note: stale connection check has been disabled)

Average GET time with HttpClient, payload ~150 byte: 5 ms
Average GET time with HttpURLConnection, payload ~150 byte: 2 ms
Average GET time with HttpClient, payload ~12,000 byte: 4 ms
Average GET time with HttpURLConnection, payload ~12,000 byte: 3 ms
Average POST time with HttpClient, payload ~300,000 byte: 867 ms
Average POST time with HttpURLConnection, payload ~300,000 byte: 996 ms

======================================================================
HttpClient 2.0alpha3 vs HttpURLConnection 1.4.2

Average GET time with HttpClient, payload ~150 byte: 4 ms
Average GET time with HttpURLConnection, payload ~150 byte: 2 ms
Average GET time with HttpClient, payload ~12,000 byte: 4 ms
Average GET time with HttpURLConnection, payload ~12,000 byte: 2 ms
Average POST time with HttpClient, payload ~300,000 byte: 1168 ms
Average POST time with HttpURLConnection, payload ~300,000 byte: 1031 ms

======================================================================
Summary:
(1) HttpClient 2.0.1 is somewhat slower for smaller GETs, but the difference in 
performance is almost constant (1-3 ms), which is IMHO is fair price to pay for a 
significantly feature-rich API that HttpClient provides. HttpClient 2.0.1 is somewhat 
faster than HttpURLConnection for larger GETs and is significantly faster than 
HttpURLConnection for bulky POSTs when request body is streamed out unbuffered.
(2) With the stale connection check disabled HttpClient 2.0.1 performs better than 
HttpClient 2.0alpha3

IMHO HttpClient clearly performs reasonably well in all cases but for tiny GETs, and 
it performs better than HttpURLConnection in more complex cases where its better 
architecture shows.

Please let me know if you see any flaws in the way tests had been setup or have hints 
on how to further optimize HttpURLConnection performance

Oleg


=======================================================================

import org.apache.commons.httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public class PerfTest {

    public static void main(String args[]) throws Exception {
        System.setProperty("org.apache.commons.logging.Log", 
"org.apache.commons.logging.impl.NoOpLog");
        System.setProperty("org.apache.commons.logging.simplelog.log", "error");

        URL targeturl1 = new URL("http://localhost:8080/httpclienttest/body";);
        URL targeturl2 = new URL("http://localhost:8080/tomcat-docs/index.html";);
       
        // Performance optimization for HttpClient
        SimpleHttpConnectionManager connmanager = new SimpleHttpConnectionManager();
        connmanager.setConnectionStaleCheckingEnabled(false);
        HttpClient httpclient = new HttpClient(connmanager);
        httpclient.setConnectionTimeout(0);

        int N = 2000;

        long total = 0;
       
        for (int i = 0; i < N; i ++) {

            long start = System.currentTimeMillis();
            GetMethod httpget = new GetMethod(targeturl1.toExternalForm());
            try {
                httpclient.executeMethod(httpget);
                httpget.getStatusCode();
                consumeResponse(httpget.getResponseBodyAsStream());
            } finally {
                httpget.releaseConnection();
            }
            long end = System.currentTimeMillis();
            total += (end - start);
        }
        System.out.println("Average GET time with HttpClient, payload ~150 byte: "
                + (total / N) + " ms");
       
        total = 0;
        for (int i = 0; i < N; i ++) {
            long start = System.currentTimeMillis();
            HttpURLConnection httpURLConnection = (HttpURLConnection) 
targeturl1.openConnection();
            httpURLConnection.setUseCaches(false);
            httpURLConnection.setAllowUserInteraction(false);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.connect();
            httpURLConnection.getResponseCode();
            consumeResponse(httpURLConnection.getInputStream());
            long end = System.currentTimeMillis();
            total += (end - start);
        }
        System.out.println("Average GET time with HttpURLConnection, payload ~150 
byte: "
                + (total / N) + " ms");

        N = 1000;
        total = 0;
        for (int i = 0; i < N; i ++) {
            long start = System.currentTimeMillis();
            GetMethod httpget = new GetMethod(targeturl2.toExternalForm());
            try {
                httpclient.executeMethod(httpget);
                httpget.getStatusCode();
                consumeResponse(httpget.getResponseBodyAsStream());
            } finally {
                httpget.releaseConnection();
            }
            long end = System.currentTimeMillis();
            total += (end - start);
        }
        System.out.println("Average GET time with HttpClient, payload ~12,000 byte: "
                + (total / N) + " ms");

        total = 0;
        for (int i = 0; i < N; i ++) {
            long start = System.currentTimeMillis();
            HttpURLConnection httpURLConnection = (HttpURLConnection) 
targeturl2.openConnection();
            httpURLConnection.setUseCaches(false);
            httpURLConnection.setAllowUserInteraction(false);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.connect();
            httpURLConnection.getResponseCode();
            consumeResponse(httpURLConnection.getInputStream());
            long end = System.currentTimeMillis();
            total += (end - start);
        }
        System.out.println("Average GET time with HttpURLConnection, payload ~12,000 
byte: "
                + (total / N) + " ms");

       File file = new File("stuff");
           
       N = 200;
       total = 0;
       for (int i = 0; i < N; i ++) {
            long start = System.currentTimeMillis();
            PostMethod httppost = new PostMethod(targeturl1.toExternalForm());
            httppost.setRequestBody(new FileInputStream(file));
            httppost.setRequestContentLength((int)file.length());
            try {
                httpclient.executeMethod(httppost);
                httppost.getStatusCode();
                consumeResponse(httppost.getResponseBodyAsStream());
            } finally {
                httppost.releaseConnection();
            }
            long end = System.currentTimeMillis();
            total += (end - start);
       }
       System.out.println("Average POST time with HttpClient, payload ~300,000 byte: "
               + (total / N) + " ms");
           
       total = 0;
       for (int i = 0; i < N; i ++) {
            long start = System.currentTimeMillis();
            HttpURLConnection httpURLConnection = (HttpURLConnection) 
targeturl1.openConnection();
            httpURLConnection.setUseCaches(false);
            httpURLConnection.setAllowUserInteraction(false);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setRequestMethod("POST");
            postRequest(httpURLConnection.getOutputStream(), file);
            httpURLConnection.connect();
            httpURLConnection.getResponseCode();
            consumeResponse(httpURLConnection.getInputStream());
            long end = System.currentTimeMillis();
            total += (end - start);
           
        }
       System.out.println("Average POST time with HttpURLConnection, payload ~300,000 
byte: "
               + (total / N) + " ms");
    }
   
    private static byte[] consumeResponse(final InputStream instream) throws 
IOException {
       
        ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024);
        int l = -1;
        byte[] tmp = new byte[1024];
        while ((l = instream.read(tmp)) >= 0) {
            buffer.write(tmp, 0, l);
        }
        return buffer.toByteArray();
    }

    private static void postRequest(final OutputStream outstream, final File file)
        throws IOException {
       
        FileInputStream instream = new FileInputStream(file); 
        int l = -1;
        byte[] tmp = new byte[1024];
        while ((l = instream.read(tmp)) >= 0) {
            outstream.write(tmp, 0, l);
        }
    }
}





-----Original Message-----
From: Kalnichevski, Oleg
Sent: Friday, August 20, 2004 9:39 AM
To: Commons HttpClient Project
Subject: RE: HttpClient performance



Zulfi,

If you expect us to react on this report, you have to be a little more specific on how 
exactly you measured the performance, exactly what kind of HTTP methods your tests 
included, exactly what pre-release-candidate you are referring to, and what exactly 
you mean by "but it is still slower than using JDK-1.4.2". Do you actually mean using 
HttpURLConnection? Raw socket? Something else?

I'll run a few tests of my own to see if I get significant difference in terms of 
performance between HttpClient 2.0alpha3, 2.0.1, CVS HEAD (post-3.0a1) and 
HttpURLConnection

Oleg


-----Original Message-----
From: Zulfi Umrani [mailto:[EMAIL PROTECTED]
Sent: Friday, August 20, 2004 7:06 AM
To: [EMAIL PROTECTED]
Subject: HttpClient performance


Hi,

Just wanted to get the latest information on the performance issues
reported earlier. I have gone through the below emails from Archive, but
could not get a definite solution to the performance problem. Wondering
whether a definite solution was found and whether there is a patch
available. We tested the performance using pre-release-candidate version
of HttpClient(2.0) and it was much better than the release-candidate
versions and the final 2.0 version of HttpClient. Please note that I did
try using the  SimpleHttpConnectionManager and calling the
setConnectionStaleCheckingEnabled method with false argument. The
performance does improve, but it is still slower than using JDK-1.4.2. I
will appreciate if someone who knows the solution can respond.
  


http://nagoya.apache.org/eyebrowse/[EMAIL PROTECTED]&msgId=781750
http://nagoya.apache.org/eyebrowse/[EMAIL PROTECTED]&msgId=781859
http://nagoya.apache.org/eyebrowse/[EMAIL PROTECTED]&msgId=781909
http://nagoya.apache.org/eyebrowse/[EMAIL PROTECTED]&msgId=779703

Thanks.



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


***************************************************************************************************
The information in this email is confidential and may be legally privileged.  Access 
to this email by anyone other than the intended addressee is unauthorized.  If you are 
not the intended recipient of this message, any review, disclosure, copying, 
distribution, retention, or any action taken or omitted to be taken in reliance on it 
is prohibited and may be unlawful.  If you are not the intended recipient, please 
reply to or forward a copy of this message to the sender and delete the message, any 
attachments, and any copies thereof from your system.
***************************************************************************************************

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


***************************************************************************************************
The information in this email is confidential and may be legally privileged.  Access 
to this email by anyone other than the intended addressee is unauthorized.  If you are 
not the intended recipient of this message, any review, disclosure, copying, 
distribution, retention, or any action taken or omitted to be taken in reliance on it 
is prohibited and may be unlawful.  If you are not the intended recipient, please 
reply to or forward a copy of this message to the sender and delete the message, any 
attachments, and any copies thereof from your system.
***************************************************************************************************

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

Reply via email to