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]