Return-Path: Delivered-To: apmail-hc-dev-archive@www.apache.org Received: (qmail 51569 invoked from network); 20 Jan 2008 16:13:47 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 20 Jan 2008 16:13:47 -0000 Received: (qmail 40073 invoked by uid 500); 20 Jan 2008 16:13:37 -0000 Delivered-To: apmail-hc-dev-archive@hc.apache.org Received: (qmail 40044 invoked by uid 500); 20 Jan 2008 16:13:37 -0000 Mailing-List: contact dev-help@hc.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "HttpComponents Project" Delivered-To: mailing list dev@hc.apache.org Received: (qmail 40035 invoked by uid 99); 20 Jan 2008 16:13:37 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 20 Jan 2008 08:13:37 -0800 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.130] (HELO eos.apache.org) (140.211.11.130) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 20 Jan 2008 16:13:20 +0000 Received: from eos.apache.org (localhost [127.0.0.1]) by eos.apache.org (Postfix) with ESMTP id 5C63BD2C7 for ; Sun, 20 Jan 2008 16:13:26 +0000 (GMT) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Apache Wiki To: dev@hc.apache.org Date: Sun, 20 Jan 2008 16:13:26 -0000 Message-ID: <20080120161326.19603.14281@eos.apache.org> Subject: [Httpcomponents Wiki] Update of "HttpClient3vsHttpClient4vsHttpCore" by RolandWeber X-Virus-Checked: Checked by ClamAV on apache.org Dear Wiki user, You have subscribed to a wiki page or wiki category on "Httpcomponents Wiki" for change notification. The following page has been changed by RolandWeber: http://wiki.apache.org/HttpComponents/HttpClient3vsHttpClient4vsHttpCore New page: = Client side HTTP performance benchmarks = '''BIG FAT DISCLAIMER''': These benchmarks are NOT based on any scientific methodology so the numbers are likely to be non-precise == HttpClient 3.x code == {{{ public static void main(String[] args) throws Exception { if (args.length < 2) { System.out.println("Usage: "); System.exit(-1); } String targetURI = args[0]; int n = Integer.parseInt(args[1]); HttpClient httpclient = new HttpClient(); httpclient.getParams().setVersion( HttpVersion.HTTP_1_1); httpclient.getParams().setBooleanParameter( HttpMethodParams.USE_EXPECT_CONTINUE, false); httpclient.getHttpConnectionManager().getParams() .setStaleCheckingEnabled(false); GetMethod httpget = new GetMethod(targetURI); byte[] buffer = new byte[4096]; long startTime; long finishTime; int successCount = 0; int failureCount = 0; String serverName = "unknown"; long total = 0; long contentLen = 0; long totalContentLen = 0; startTime = System.currentTimeMillis(); for (int i = 0; i < n; i++) { try { httpclient.executeMethod(httpget); InputStream instream = httpget.getResponseBodyAsStream(); contentLen = 0; if (instream != null) { int l = 0; while ((l = instream.read(buffer)) != -1) { total += l; contentLen += l; } } successCount++; totalContentLen += contentLen; } catch (IOException ex) { failureCount++; } finally { httpget.releaseConnection(); } } finishTime = System.currentTimeMillis(); Header header = httpget.getResponseHeader("Server"); if (header != null) { serverName = header.getValue(); } float totalTimeSec = (float) (finishTime - startTime) / 1000; float reqsPerSec = (float) successCount / totalTimeSec; float timePerReqMs = (float) (finishTime - startTime) / (float) successCount; System.out.print("Server Software:\t"); System.out.println(serverName); System.out.println(); System.out.print("Document URI:\t\t"); System.out.println(targetURI); System.out.print("Document Length:\t"); System.out.print(contentLen); System.out.println(" bytes"); System.out.println(); System.out.print("Time taken for tests:\t"); System.out.print(totalTimeSec); System.out.println(" seconds"); System.out.print("Complete requests:\t"); System.out.println(successCount); System.out.print("Failed requests:\t"); System.out.println(failureCount); System.out.print("Content transferred:\t"); System.out.print(total); System.out.println(" bytes"); System.out.print("Requests per second:\t"); System.out.print(reqsPerSec); System.out.println(" [#/sec] (mean)"); System.out.print("Time per request:\t"); System.out.print(timePerReqMs); System.out.println(" [ms] (mean)"); } }}} == HttpClient 4.x code == {{{ if (args.length < 2) { System.out.println("Usage: "); System.exit(-1); } String targetURI = args[0]; int n = Integer.parseInt(args[1]); BasicHttpParams params = new BasicHttpParams(); params.setParameter(HttpProtocolParams.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); params.setBooleanParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); params.setBooleanParameter(HttpConnectionParams.STALE_CONNECTION_CHECK, false); params.setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE, 2 * 1024); DefaultHttpClient httpclient = new DefaultHttpClient(params); HttpGet httpget = new HttpGet(targetURI); byte[] buffer = new byte[4096]; long startTime; long finishTime; int successCount = 0; int failureCount = 0; String serverName = "unknown"; long total = 0; long contentLen = 0; long totalContentLen = 0; startTime = System.currentTimeMillis(); for (int i = 0; i < n; i++) { HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); try { contentLen = 0; if (instream != null) { int l = 0; while ((l = instream.read(buffer)) != -1) { total += l; contentLen += l; } } successCount++; totalContentLen += contentLen; } catch (IOException ex) { httpget.abort(); failureCount++; } finally { instream.close(); } } Header header = response.getFirstHeader("Server"); if (header != null) { serverName = header.getValue(); } } finishTime = System.currentTimeMillis(); float totalTimeSec = (float) (finishTime - startTime) / 1000; float reqsPerSec = (float) successCount / totalTimeSec; float timePerReqMs = (float) (finishTime - startTime) / (float) successCount; System.out.print("Server Software:\t"); System.out.println(serverName); System.out.println(); System.out.print("Document URI:\t\t"); System.out.println(targetURI); System.out.print("Document Length:\t"); System.out.print(contentLen); System.out.println(" bytes"); System.out.println(); System.out.print("Time taken for tests:\t"); System.out.print(totalTimeSec); System.out.println(" seconds"); System.out.print("Complete requests:\t"); System.out.println(successCount); System.out.print("Failed requests:\t"); System.out.println(failureCount); System.out.print("Content transferred:\t"); System.out.print(total); System.out.println(" bytes"); System.out.print("Requests per second:\t"); System.out.print(reqsPerSec); System.out.println(" [#/sec] (mean)"); System.out.print("Time per request:\t"); System.out.print(timePerReqMs); System.out.println(" [ms] (mean)"); } }}} == HttpCore 4.x code == {{{ public static void main(String[] args) throws Exception { if (args.length < 2) { System.out.println("Usage: "); System.exit(-1); } URI targetURI = new URI(args[0]); int n = Integer.parseInt(args[1]); HttpHost targetHost = new HttpHost( targetURI.getHost(), targetURI.getPort()); BasicHttpParams params = new BasicHttpParams(); params.setParameter(HttpProtocolParams.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); params.setBooleanParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); params.setBooleanParameter(HttpConnectionParams.STALE_CONNECTION_CHECK, false); params.setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE, 2 * 1024); BasicHttpRequest httpget = new BasicHttpRequest("GET", targetURI.getPath()); byte[] buffer = new byte[4096]; long startTime; long finishTime; int successCount = 0; int failureCount = 0; String serverName = "unknown"; long total = 0; long contentLen = 0; long totalContentLen = 0; HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); BasicHttpProcessor httpproc = new BasicHttpProcessor(); // Required protocol interceptors httpproc.addInterceptor(new RequestContent()); httpproc.addInterceptor(new RequestTargetHost()); // Recommended protocol interceptors httpproc.addInterceptor(new RequestConnControl()); httpproc.addInterceptor(new RequestUserAgent()); httpproc.addInterceptor(new RequestExpectContinue()); HttpContext context = new HttpExecutionContext(null); DefaultHttpClientConnection conn = new DefaultHttpClientConnection(); DefaultConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy(); startTime = System.currentTimeMillis(); for (int i = 0; i < n; i++) { if (!conn.isOpen()) { Socket socket = new Socket( targetHost.getHostName(), targetHost.getPort() > 0 ? targetHost.getPort() : 80); conn.bind(socket, params); } context.setAttribute(HttpExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(HttpExecutionContext.HTTP_TARGET_HOST, targetHost); context.setAttribute(HttpExecutionContext.HTTP_REQUEST, httpget); httpexecutor.preProcess(httpget, httpproc, context); HttpResponse response = httpexecutor.execute(httpget, conn, context); context.setAttribute(HttpExecutionContext.HTTP_RESPONSE, response); httpexecutor.postProcess(response, httpproc, context); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); try { contentLen = 0; if (instream != null) { int l = 0; while ((l = instream.read(buffer)) != -1) { total += l; contentLen += l; } } successCount++; totalContentLen += contentLen; } catch (IOException ex) { conn.shutdown(); failureCount++; } finally { instream.close(); } } if (!connStrategy.keepAlive(response, context)) { conn.close(); } Header header = response.getFirstHeader("Server"); if (header != null) { serverName = header.getValue(); } } finishTime = System.currentTimeMillis(); float totalTimeSec = (float) (finishTime - startTime) / 1000; float reqsPerSec = (float) successCount / totalTimeSec; float timePerReqMs = (float) (finishTime - startTime) / (float) successCount; System.out.print("Server Software:\t"); System.out.println(serverName); System.out.println(); System.out.print("Document URI:\t\t"); System.out.println(targetURI); System.out.print("Document Length:\t"); System.out.print(contentLen); System.out.println(" bytes"); System.out.println(); System.out.print("Time taken for tests:\t"); System.out.print(totalTimeSec); System.out.println(" seconds"); System.out.print("Complete requests:\t"); System.out.println(successCount); System.out.print("Failed requests:\t"); System.out.println(failureCount); System.out.print("Content transferred:\t"); System.out.print(total); System.out.println(" bytes"); System.out.print("Requests per second:\t"); System.out.print(reqsPerSec); System.out.println(" [#/sec] (mean)"); System.out.print("Time per request:\t"); System.out.print(timePerReqMs); System.out.println(" [ms] (mean)"); } }}} == Results == === Platform: Ubuntu Linux 7.04 (i686, 2.6.20-16-generic); java version "1.5.0_11" === ==== 200,000 HTTP GETs, keep alive, content length: 22 bytes ==== * !HttpClient 3.x {{{ java -cp bin:/opt/libjava/commons-httpclient.jar:/opt/libjava/commons-logging.jar:/opt/libjava/commons-codec.jar \ test.perf.HttpClient3PerfTest http://localhost/msg.txt 200000 }}} {{{ Server Software: Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c Document URI: http://localhost/msg.txt Document Length: 22 bytes Time taken for tests: 29.144 seconds Complete requests: 200000 Failed requests: 0 Content transferred: 4400000 bytes Requests per second: 6862.476 [#/sec] (mean) Time per request: 0.14572 [ms] (mean) }}} * !HttpClient 4.x {{{ java -cp bin:/opt/libjava/commons-logging.jar:/opt/libjava/commons-codec.jar:lib/httpcore-4.0-alpha5.jar: lib/httpclient-4.0-alpha1-SNAPSHOT.jar \ test.perf.HttpClient4PerfTest http://localhost/msg.txt 200000 }}} {{{ Server Software: Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c Document URI: http://localhost/msg.txt Document Length: 22 bytes Time taken for tests: 24.408 seconds Complete requests: 200000 Failed requests: 0 Content transferred: 4400000 bytes Requests per second: 8194.034 [#/sec] (mean) Time per request: 0.12204 [ms] (mean) }}} * !HttpCore 4.x {{{ java -cp bin:lib/httpcore-4.0-alpha5.jar \ test.perf.HttpCorePerfTest http://localhost/msg.txt 200000 }}} {{{ Server Software: Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c Document URI: http://localhost/msg.txt Document Length: 22 bytes Time taken for tests: 19.567 seconds Complete requests: 200000 Failed requests: 0 Content transferred: 4400000 bytes Requests per second: 10221.291 [#/sec] (mean) Time per request: 0.097835 [ms] (mean) }}} ==== 200,000 HTTP GETs, keep alive, content length: 20,000 bytes ==== * !HttpClient 3.x {{{ java -cp bin:/opt/libjava/commons-httpclient.jar:/opt/libjava/commons-logging.jar:/opt/libjava/commons-codec.jar \ test.perf.HttpClient3PerfTest http://localhost/blob 200000 }}} {{{ Server Software: Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c Document URI: http://localhost/blob Document Length: 20000 bytes Time taken for tests: 35.809 seconds Complete requests: 200000 Failed requests: 0 Content transferred: 4000000000 bytes Requests per second: 5585.1885 [#/sec] (mean) Time per request: 0.179045 [ms] (mean) }}} * !HttpClient 4.x {{{ java -cp bin:/opt/libjava/commons-logging.jar:/opt/libjava/commons-codec.jar:lib/httpcore-4.0-alpha5.jar: lib/httpclient-4.0-alpha1-SNAPSHOT.jar \ test.perf.HttpClient4PerfTest http://localhost/blob 200000 }}} {{{ Server Software: Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c Document URI: http://localhost/blob Document Length: 20000 bytes Time taken for tests: 33.398 seconds Complete requests: 200000 Failed requests: 0 Content transferred: 4000000000 bytes Requests per second: 5988.383 [#/sec] (mean) Time per request: 0.16699 [ms] (mean) }}} * !HttpCore 4.x {{{ java -cp bin:lib/httpcore-4.0-alpha5.jar \ test.perf.HttpCorePerfTest http://localhost/blob 200000 }}} {{{ Server Software: Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c Document URI: http://localhost/blob Document Length: 20000 bytes Time taken for tests: 28.584 seconds Complete requests: 200000 Failed requests: 0 Content transferred: 4000000000 bytes Requests per second: 6996.9214 [#/sec] (mean) Time per request: 0.14292 [ms] (mean) }}} --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org For additional commands, e-mail: dev-help@hc.apache.org