[prev in list] [next in list] [prev in thread] [next in thread]
List: httpclient-commons-dev
Subject: Performance HttpClient 2.0.1 vs HttpClient 2.0-alpha3 vs HttpURLConnection jre1.4
From: "Kalnichevski, Oleg" <oleg.kalnichevski () bearingpoint ! com>
Date: 2004-08-20 13:29:22
Message-ID: 825BF35A92B3F0479CC164ECBBE9376EE3B701 () kccxoex06 ! corp ! kpmgconsulting ! com
[Download RAW message or body]
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:zumrani@novell.com]
Sent: Friday, August 20, 2004 7:06 AM
To: commons-httpclient-dev@jakarta.apache.org
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/ReadMsg?listName=commons-httpclient-dev@jakarta.apache.org&msgId=781750
http://nagoya.apache.org/eyebrowse/ReadMsg?listName=commons-httpclient-dev@jakarta.apache.org&msgId=781859
http://nagoya.apache.org/eyebrowse/ReadMsg?listName=commons-httpclient-dev@jakarta.apache.org&msgId=781909
http://nagoya.apache.org/eyebrowse/ReadMsg?listName=commons-httpclient-dev@jakarta.apache.org&msgId=779703
Thanks.
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-httpclient-dev-help@jakarta.apache.org
***************************************************************************************************
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: commons-httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-httpclient-dev-help@jakarta.apache.org
***************************************************************************************************
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: commons-httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-httpclient-dev-help@jakarta.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic