You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2010/03/03 20:19:36 UTC

svn commit: r918642 - in /httpcomponents/httpclient/trunk/httpclient-benchmark: ./ src/main/java/org/apache/http/client/benchmark/

Author: olegk
Date: Wed Mar  3 19:19:35 2010
New Revision: 918642

URL: http://svn.apache.org/viewvc?rev=918642&view=rev
Log:
Improved HTTP client benchmark

Added:
    httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java   (with props)
    httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Stats.java   (with props)
    httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpAgent.java   (with props)
Modified:
    httpcomponents/httpclient/trunk/httpclient-benchmark/pom.xml
    httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient3.java
    httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java
    httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpCore.java
    httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpJRE.java

Modified: httpcomponents/httpclient/trunk/httpclient-benchmark/pom.xml
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-benchmark/pom.xml?rev=918642&r1=918641&r2=918642&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-benchmark/pom.xml (original)
+++ httpcomponents/httpclient/trunk/httpclient-benchmark/pom.xml Wed Mar  3 19:19:35 2010
@@ -59,6 +59,29 @@
       <artifactId>commons-httpclient</artifactId>
       <version>3.1</version>
     </dependency>
+    <dependency>
+      <groupId>commons-httpclient</groupId>
+      <artifactId>commons-httpclient</artifactId>
+      <version>3.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>7.0.1.v20091125</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.5.10</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-nop</artifactId>
+      <version>1.5.10</version>
+      <scope>compile</scope>
+    </dependency>
   </dependencies>
 
   <properties>

Added: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java?rev=918642&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java (added)
+++ httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java Wed Mar  3 19:19:35 2010
@@ -0,0 +1,191 @@
+/*
+ * ====================================================================
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.client.benchmark;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.net.URI;
+import java.util.Random;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.bio.SocketConnector;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.util.ByteArrayOutputStream2;
+import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+
+public class Benchmark {
+
+   public static void main(String[] args) throws Exception {
+       SocketConnector connector = new SocketConnector();
+       connector.setPort(0);
+       connector.setRequestBufferSize(12 * 1024);
+       connector.setResponseBufferSize(12 * 1024);
+       connector.setAcceptors(2);
+       
+       QueuedThreadPool threadpool = new QueuedThreadPool();
+       threadpool.setMinThreads(25);
+       threadpool.setMaxThreads(200);
+       
+       Server server = new Server();
+       server.addConnector(connector);
+       server.setThreadPool(threadpool);
+       server.setHandler(new RandomDataHandler());
+       
+       server.start();
+       int port = connector.getLocalPort();
+       int n = 200000;
+       int contentLen = 2048;
+       
+       TestHttpAgent[] agents = new TestHttpAgent[] {
+               new TestHttpClient3(),
+               new TestHttpJRE(),
+               new TestHttpCore(),
+               new TestHttpClient4()
+       };
+
+       byte[] content = new byte[contentLen];
+       Random rnd = new Random();
+       rnd.nextBytes(content);
+
+       URI target1 = new URI("http", null, "localhost", port, "/rnd", "c=" + contentLen, null);
+       URI target2 = new URI("http", null, "localhost", port, "/echo", null, null);
+       
+       try {
+           for (TestHttpAgent agent: agents) {
+               System.out.println("=================================");
+               System.out.println("HTTP agent: " + agent.getClientName());
+               System.out.println("---------------------------------");
+               System.out.println(n + " GET requests");
+               System.out.println("---------------------------------");
+               
+               long startTime1 = System.currentTimeMillis();
+               Stats stats1 = agent.get(target1, n);
+               long finishTime1 = System.currentTimeMillis();
+               Stats.printStats(target1, startTime1, finishTime1, stats1);
+               System.out.println("---------------------------------");
+               System.out.println(n + " POST requests");
+               System.out.println("---------------------------------");
+               
+               long startTime2 = System.currentTimeMillis();
+               Stats stats2 = agent.post(target2, content, n);
+               long finishTime2 = System.currentTimeMillis();
+               Stats.printStats(target2, startTime2, finishTime2, stats2);
+               System.out.println("---------------------------------");
+           }
+       } finally {
+           server.stop();
+       }
+       server.join();
+    }
+
+   static class RandomDataHandler extends AbstractHandler {
+       
+       public RandomDataHandler() {
+           super();
+       }
+       
+       public void handle(
+               final String target, 
+               final Request baseRequest, 
+               final HttpServletRequest request, 
+               final HttpServletResponse response) throws IOException, ServletException {
+           if (target.equals("/rnd")) {
+               rnd(request, response);
+           } else if (target.equals("/echo")) {
+               echo(request, response);
+           } else {
+               response.setStatus(HttpStatus.NOT_FOUND_404);
+               Writer writer = response.getWriter();
+               writer.write("Target not found: " + target);
+               writer.flush();
+           }
+       }
+
+       private void rnd(
+               final HttpServletRequest request, 
+               final HttpServletResponse response) throws IOException, ServletException {
+           int count = 100;
+           String s = request.getParameter("c");
+           try {
+               count = Integer.parseInt(s);
+           } catch (NumberFormatException ex) {
+               response.setStatus(500);
+               Writer writer = response.getWriter();
+               writer.write("Invalid query format: " + request.getQueryString());
+               writer.flush();
+               return;
+           }
+           
+           response.setStatus(200);
+           response.setContentLength(count);
+           
+           OutputStream outstream = response.getOutputStream();
+           byte[] tmp = new byte[1024];
+           int r = Math.abs(tmp.hashCode());
+           int remaining = count;
+           while (remaining > 0) {
+               int chunk = Math.min(tmp.length, remaining);
+               for (int i = 0; i < chunk; i++) {
+                   tmp[i] = (byte) ((r + i) % 96 + 32);
+               }
+               outstream.write(tmp, 0, chunk);
+               remaining -= chunk;
+           }
+           outstream.flush();
+       }
+       
+       private void echo(
+               final HttpServletRequest request, 
+               final HttpServletResponse response) throws IOException, ServletException {
+
+           ByteArrayOutputStream2 buffer = new ByteArrayOutputStream2();   
+           InputStream instream = request.getInputStream();
+           if (instream != null) {
+               IO.copy(instream, buffer);
+           }
+           byte[] content = buffer.getBuf();
+           
+           response.setStatus(200);
+           response.setContentLength(content.length);
+           
+           OutputStream outstream = response.getOutputStream();
+           outstream.write(content);
+           outstream.flush();
+       }
+
+   }
+   
+}
+

Propchange: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Stats.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Stats.java?rev=918642&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Stats.java (added)
+++ httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Stats.java Wed Mar  3 19:19:35 2010
@@ -0,0 +1,115 @@
+/*
+ * ====================================================================
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.client.benchmark;
+
+import java.net.URI;
+
+public class Stats {
+
+    private int successCount = 0;
+    private int failureCount = 0;
+    private String serverName = "unknown";
+    private long contentLen = 0;
+    private long totalContentLen = 0;
+        
+    public Stats() {
+        super();
+    }
+
+    public int getSuccessCount() {
+        return successCount;
+    }
+
+    public void setSuccessCount(int successCount) {
+        this.successCount = successCount;
+    }
+
+    public int getFailureCount() {
+        return failureCount;
+    }
+
+    public void setFailureCount(int failureCount) {
+        this.failureCount = failureCount;
+    }
+
+    public String getServerName() {
+        return serverName;
+    }
+
+    public void setServerName(String serverName) {
+        this.serverName = serverName;
+    }
+
+    public long getContentLen() {
+        return contentLen;
+    }
+
+    public void setContentLen(long contentLen) {
+        this.contentLen = contentLen;
+    }
+
+    public long getTotalContentLen() {
+        return totalContentLen;
+    }
+
+    public void setTotalContentLen(long totalContentLen) {
+        this.totalContentLen = totalContentLen;
+    }
+    
+    public static void printStats(
+            final URI targetURI, long startTime, long finishTime, final Stats stats) {
+        float totalTimeSec = (float) (finishTime - startTime) / 1000;
+        float reqsPerSec = (float) stats.getSuccessCount() / totalTimeSec;
+        float timePerReqMs = (float) (finishTime - startTime) / (float) stats.getSuccessCount();
+       
+        System.out.print("Server Software:\t");
+        System.out.println(stats.getServerName());
+        System.out.println();
+        System.out.print("Document URI:\t\t");
+        System.out.println(targetURI);
+        System.out.print("Document Length:\t");
+        System.out.print(stats.getContentLen());
+        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(stats.getSuccessCount());
+        System.out.print("Failed requests:\t");
+        System.out.println(stats.getFailureCount());
+        System.out.print("Content transferred:\t");
+        System.out.print(stats.getTotalContentLen());
+        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)");
+    }
+    
+}
\ No newline at end of file

Propchange: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Stats.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Stats.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpAgent.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpAgent.java?rev=918642&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpAgent.java (added)
+++ httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpAgent.java Wed Mar  3 19:19:35 2010
@@ -0,0 +1,38 @@
+/*
+ * ====================================================================
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.client.benchmark;
+
+import java.net.URI;
+
+public interface TestHttpAgent {
+
+    String getClientName();
+    
+    Stats get(URI target, int count) throws Exception;
+   
+    Stats post(URI target, byte[] content, int n) throws Exception;
+    
+}
\ No newline at end of file

Propchange: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpAgent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpAgent.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient3.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient3.java?rev=918642&r1=918641&r2=918642&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient3.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient3.java Wed Mar  3 19:19:35 2010
@@ -27,54 +27,51 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
 
 import org.apache.commons.httpclient.Header;
 import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
 import org.apache.commons.httpclient.HttpVersion;
+import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
 import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
 import org.apache.commons.httpclient.params.HttpMethodParams;
 
-public class TestHttpClient3 {
+public class TestHttpClient3 implements TestHttpAgent {
 
-    public static void main(String[] args) throws Exception {
-        if (args.length < 2) {
-            System.out.println("Usage: <target URI> <no of requests>");
-            System.exit(-1);
-        }
-        String targetURI = args[0];
-        int n = Integer.parseInt(args[1]);
-        
-        HttpClient httpclient = new HttpClient();
-        httpclient.getParams().setVersion(
+    private final HttpClient httpclient;
+    
+    public TestHttpClient3() {
+        super();
+        this.httpclient = new HttpClient();
+        this.httpclient.getParams().setVersion(
                 HttpVersion.HTTP_1_1);
-        httpclient.getParams().setBooleanParameter(
+        this.httpclient.getParams().setBooleanParameter(
                 HttpMethodParams.USE_EXPECT_CONTINUE, false);
-        httpclient.getHttpConnectionManager().getParams()
+        this.httpclient.getHttpConnectionManager().getParams()
                 .setStaleCheckingEnabled(false);
-        
-        GetMethod httpget = new GetMethod(targetURI);
+    }
 
-        byte[] buffer = new byte[4096];
+    public Stats execute(final HttpMethod httpmethod, int n) throws Exception {
+
+        Stats stats = new Stats();
         
-        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();
+        byte[] buffer = new byte[4096];
+        
         for (int i = 0; i < n; i++) {
             try {
-                httpclient.executeMethod(httpget);
-                InputStream instream = httpget.getResponseBodyAsStream();
+                this.httpclient.executeMethod(httpmethod);
+                InputStream instream = httpmethod.getResponseBodyAsStream();
                 contentLen = 0;
                 if (instream != null) {
                     int l = 0;
                     while ((l = instream.read(buffer)) != -1) {
-                        total += l;
                         contentLen += l;
                     }
                 }
@@ -83,45 +80,51 @@
             } catch (IOException ex) {
                 failureCount++;
             } finally {
-                httpget.releaseConnection();
+                httpmethod.releaseConnection();
             }
         }
-        finishTime = System.currentTimeMillis();
-        
-        Header header = httpget.getResponseHeader("Server");
+        Header header = httpmethod.getResponseHeader("Server");
         if (header != null) {
-            serverName = header.getValue();
+            stats.setServerName(header.getValue());
         }
+
+        stats.setSuccessCount(successCount);
+        stats.setFailureCount(failureCount);
+        stats.setContentLen(contentLen);
+        stats.setTotalContentLen(totalContentLen);
+        return stats;
+    }
+    
+    public Stats get(final URI target, int n) throws Exception {
+        GetMethod httpget = new GetMethod(target.toASCIIString());
+        return execute(httpget, n);
+    }
+
+    public Stats post(URI target, byte[] content, int n) throws Exception {
+        PostMethod httppost = new PostMethod(target.toASCIIString());
+        httppost.setRequestEntity(new ByteArrayRequestEntity(content));
+        return execute(httppost, n);
+    }
+
+    public String getClientName() {
+        return "Apache HttpClient 3.1";
+    }
+
+    public static void main(String[] args) throws Exception {
+        if (args.length < 2) {
+            System.out.println("Usage: <target URI> <no of requests>");
+            System.exit(-1);
+        }
+        URI targetURI = new URI(args[0]);
+        int n = Integer.parseInt(args[1]);
         
-        float totalTimeSec = (float) (finishTime - startTime) / 1000;
-        float reqsPerSec = (float) successCount / totalTimeSec; 
-        float timePerReqMs = (float) (finishTime - startTime) / (float) successCount; 
+        TestHttpClient3 test = new TestHttpClient3(); 
         
-        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)");
+        long startTime = System.currentTimeMillis();
+        Stats stats = test.get(targetURI, n);
+        long finishTime = System.currentTimeMillis();
+       
+        Stats.printStats(targetURI, startTime, finishTime, stats);
     }
 
 }

Modified: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java?rev=918642&r1=918641&r2=918642&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java Wed Mar  3 19:19:35 2010
@@ -27,28 +27,31 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
 
 import org.apache.http.Header;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpVersion;
+import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.entity.ByteArrayEntity;
 import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.params.BasicHttpParams;
 import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
 import org.apache.http.params.HttpProtocolParams;
+import org.apache.http.params.SyncBasicHttpParams;
+import org.apache.http.util.VersionInfo;
 
-public class TestHttpClient4 {
+public class TestHttpClient4 implements TestHttpAgent {
 
-    public static void main(String[] args) throws Exception {
-        if (args.length < 2) {
-            System.out.println("Usage: <target URI> <no of requests>");
-            System.exit(-1);
-        }
-        String targetURI = args[0];
-        int n = Integer.parseInt(args[1]);
-       
-        BasicHttpParams params = new BasicHttpParams();
+    private final HttpClient httpclient;
+    
+    public TestHttpClient4() {
+        super();
+        HttpParams params = new SyncBasicHttpParams();
         params.setParameter(HttpProtocolParams.PROTOCOL_VERSION,
                 HttpVersion.HTTP_1_1);
         params.setBooleanParameter(HttpProtocolParams.USE_EXPECT_CONTINUE,
@@ -58,24 +61,21 @@
         params.setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE,
                 8 * 1024);
        
-        DefaultHttpClient httpclient = new DefaultHttpClient(params);
-       
-        HttpGet httpget = new HttpGet(targetURI);
+        this.httpclient = new DefaultHttpClient(params);
+    }
 
-        byte[] buffer = new byte[4096];
-       
-        long startTime;
-        long finishTime;
+    public Stats execute(final HttpUriRequest request, int n) throws Exception {
+        Stats stats = new Stats();
+        
         int successCount = 0;
         int failureCount = 0;
-        String serverName = "unknown";
-        long total = 0;
         long contentLen = 0;
         long totalContentLen = 0;
-       
-        startTime = System.currentTimeMillis();
+        
+        byte[] buffer = new byte[4096];
+        
         for (int i = 0; i < n; i++) {
-            HttpResponse response = httpclient.execute(httpget);
+            HttpResponse response = this.httpclient.execute(request);
             HttpEntity entity = response.getEntity();
             if (entity != null) {
                 InputStream instream = entity.getContent();
@@ -84,14 +84,13 @@
                     if (instream != null) {
                         int l = 0;
                         while ((l = instream.read(buffer)) != -1) {
-                            total += l;
                             contentLen += l;
                         }
                     }
                     successCount++;
                     totalContentLen += contentLen;
                 } catch (IOException ex) {
-                    httpget.abort();
+                    request.abort();
                     failureCount++;
                 } finally {
                     instream.close();
@@ -99,40 +98,49 @@
             }
             Header header = response.getFirstHeader("Server");
             if (header != null) {
-                serverName = header.getValue();
+                stats.setServerName(header.getValue());
             }
         }
-        finishTime = System.currentTimeMillis();
-       
-        float totalTimeSec = (float) (finishTime - startTime) / 1000;
-        float reqsPerSec = (float) successCount / totalTimeSec;
-        float timePerReqMs = (float) (finishTime - startTime) / (float) successCount;
+        stats.setSuccessCount(successCount);
+        stats.setFailureCount(failureCount);
+        stats.setContentLen(contentLen);
+        stats.setTotalContentLen(totalContentLen);
+        return stats;
+    }    
+    
+    public Stats get(final URI target, int n) throws Exception {
+        HttpGet httpget = new HttpGet(target);
+        return execute(httpget, n);
+    }
+    
+    public Stats post(final URI target, byte[] content, int n) throws Exception {
+        HttpPost httppost = new HttpPost(target);
+        httppost.setEntity(new ByteArrayEntity(content));
+        return execute(httppost, n);
+    }
+    
+    public String getClientName() {
+        VersionInfo vinfo = VersionInfo.loadVersionInfo("org.apache.http.client", 
+                Thread.currentThread().getContextClassLoader());
+        return "Apache HttpClient 4 (ver: " + 
+            ((vinfo != null) ? vinfo.getRelease() : VersionInfo.UNAVAILABLE) + ")";
+    }
+
+    public static void main(String[] args) throws Exception {
+        if (args.length < 2) {
+            System.out.println("Usage: <target URI> <no of requests>");
+            System.exit(-1);
+        }
+        URI targetURI = new URI(args[0]);
+        int n = Integer.parseInt(args[1]);
+        
+        TestHttpClient4 test = new TestHttpClient4(); 
+        
+        long startTime = System.currentTimeMillis();
+        Stats stats = test.get(targetURI, n);
+        long finishTime = System.currentTimeMillis();
        
-        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)");
+        Stats.printStats(targetURI, startTime, finishTime, stats);
     }
    
 } 
\ No newline at end of file

Modified: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpCore.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpCore.java?rev=918642&r1=918641&r2=918642&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpCore.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpCore.java Wed Mar  3 19:19:35 2010
@@ -30,96 +30,95 @@
 import java.net.Socket;
 import java.net.URI;
 
+import org.apache.http.ConnectionReuseStrategy;
 import org.apache.http.Header;
+import org.apache.http.HeaderIterator;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpRequestInterceptor;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpVersion;
+import org.apache.http.entity.ByteArrayEntity;
 import org.apache.http.impl.DefaultConnectionReuseStrategy;
 import org.apache.http.impl.DefaultHttpClientConnection;
+import org.apache.http.message.BasicHttpEntityEnclosingRequest;
 import org.apache.http.message.BasicHttpRequest;
-import org.apache.http.params.BasicHttpParams;
 import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
 import org.apache.http.params.HttpProtocolParams;
+import org.apache.http.params.SyncBasicHttpParams;
 import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.BasicHttpProcessor;
 import org.apache.http.protocol.ExecutionContext;
 import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpProcessor;
 import org.apache.http.protocol.HttpRequestExecutor;
+import org.apache.http.protocol.ImmutableHttpProcessor;
 import org.apache.http.protocol.RequestConnControl;
 import org.apache.http.protocol.RequestContent;
-import org.apache.http.protocol.RequestExpectContinue;
 import org.apache.http.protocol.RequestTargetHost;
 import org.apache.http.protocol.RequestUserAgent;
+import org.apache.http.util.VersionInfo;
 
-public class TestHttpCore {
+public class TestHttpCore implements TestHttpAgent {
 
-    public static void main(String[] args) throws Exception {
-        if (args.length < 2) {
-            System.out.println("Usage: <target URI> <no of requests>");
-            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,
+    private final HttpParams params;
+    private final HttpProcessor httpproc;
+    private final HttpRequestExecutor httpexecutor;
+    private final ConnectionReuseStrategy connStrategy;
+    
+    public TestHttpCore() {
+        super();
+        this.params = new SyncBasicHttpParams();
+        this.params.setParameter(HttpProtocolParams.PROTOCOL_VERSION,
                 HttpVersion.HTTP_1_1);
-        params.setBooleanParameter(HttpProtocolParams.USE_EXPECT_CONTINUE,
+        this.params.setBooleanParameter(HttpProtocolParams.USE_EXPECT_CONTINUE,
                 false);
-        params.setBooleanParameter(HttpConnectionParams.STALE_CONNECTION_CHECK,
+        this.params.setBooleanParameter(HttpConnectionParams.STALE_CONNECTION_CHECK,
                 false);
-        params.setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE,
+        this.params.setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE,
                 8 * 1024);
-       
-        BasicHttpRequest httpget = new BasicHttpRequest("GET", targetURI.getPath());
+        
+        this.httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[] {
+                new RequestContent(),
+                new RequestTargetHost(),
+                new RequestConnControl(),
+                new RequestUserAgent()
+                
+        }, null);
 
-        byte[] buffer = new byte[4096];
-       
-        long startTime;
-        long finishTime;
+        this.httpexecutor = new HttpRequestExecutor();
+        this.connStrategy = new DefaultConnectionReuseStrategy();
+    }
+    
+    public Stats execute(
+            final HttpHost targetHost, final HttpRequest request, int n) throws Exception {
+        
+        Stats stats = new Stats();
+        
         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());
-       
+        
+        byte[] buffer = new byte[4096];
         HttpContext context = new BasicHttpContext();
 
         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);
+                conn.bind(socket, this.params);
             }
 
             context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
             context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, targetHost);
 
-            httpexecutor.preProcess(httpget, httpproc, context);
-            HttpResponse response = httpexecutor.execute(httpget, conn, context);
-            httpexecutor.postProcess(response, httpproc, context);
+            this.httpexecutor.preProcess(request, this.httpproc, context);
+            HttpResponse response = this.httpexecutor.execute(request, conn, context);
+            this.httpexecutor.postProcess(response, this.httpproc, context);
            
             HttpEntity entity = response.getEntity();
             if (entity != null) {
@@ -129,7 +128,6 @@
                     if (instream != null) {
                         int l = 0;
                         while ((l = instream.read(buffer)) != -1) {
-                            total += l;
                             contentLen += l;
                         }
                     }
@@ -142,45 +140,73 @@
                     instream.close();
                 }
             }
-            if (!connStrategy.keepAlive(response, context)) {
+            if (!this.connStrategy.keepAlive(response, context)) {
                 conn.close();
             }
             Header header = response.getFirstHeader("Server");
             if (header != null) {
-                serverName = header.getValue();
+                stats.setServerName(header.getValue());
+            }
+            for (HeaderIterator it = request.headerIterator(); it.hasNext();) {
+                it.next();
+                it.remove();
             }
         }
-        finishTime = System.currentTimeMillis();
-       
-        float totalTimeSec = (float) (finishTime - startTime) / 1000;
-        float reqsPerSec = (float) successCount / totalTimeSec;
-        float timePerReqMs = (float) (finishTime - startTime) / (float) successCount;
+        stats.setSuccessCount(successCount);
+        stats.setFailureCount(failureCount);
+        stats.setContentLen(contentLen);
+        stats.setTotalContentLen(totalContentLen);
+        return stats;
+    }
+    
+    public Stats get(final URI target, int n) throws Exception {
+        HttpHost targetHost = new HttpHost(target.getHost(), target.getPort());
+        StringBuilder buffer = new StringBuilder();
+        buffer.append(target.getPath());
+        if (target.getQuery() != null) {
+            buffer.append("?");
+            buffer.append(target.getQuery());
+        }
+        BasicHttpRequest httpget = new BasicHttpRequest("GET", buffer.toString());
+        return execute(targetHost, httpget, n);
+    }
+    
+    public Stats post(final URI target, byte[] content, int n) throws Exception {
+        HttpHost targetHost = new HttpHost(target.getHost(), target.getPort());
+        StringBuilder buffer = new StringBuilder();
+        buffer.append(target.getPath());
+        if (target.getQuery() != null) {
+            buffer.append("?");
+            buffer.append(target.getQuery());
+        }
+        BasicHttpEntityEnclosingRequest httppost = new BasicHttpEntityEnclosingRequest("POST", 
+                buffer.toString());
+        httppost.setEntity(new ByteArrayEntity(content));
+        return execute(targetHost, httppost, n);
+    }
+    
+    public String getClientName() {
+        VersionInfo vinfo = VersionInfo.loadVersionInfo("org.apache.http", 
+                Thread.currentThread().getContextClassLoader());
+        return "Apache HttpCore 4 (ver: " + 
+            ((vinfo != null) ? vinfo.getRelease() : VersionInfo.UNAVAILABLE) + ")";
+    }
+
+    public static void main(String[] args) throws Exception {
+        if (args.length < 2) {
+            System.out.println("Usage: <target URI> <no of requests>");
+            System.exit(-1);
+        }
+        URI targetURI = new URI(args[0]);
+        int n = Integer.parseInt(args[1]);
+
+        TestHttpCore test = new TestHttpCore(); 
+        
+        long startTime = System.currentTimeMillis();
+        Stats stats = test.get(targetURI, n);
+        long finishTime = System.currentTimeMillis();
        
-        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)");
+        Stats.printStats(targetURI, startTime, finishTime, stats);
     }
    
 }
\ No newline at end of file

Modified: httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpJRE.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpJRE.java?rev=918642&r1=918641&r2=918642&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpJRE.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpJRE.java Wed Mar  3 19:19:35 2010
@@ -27,44 +27,49 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URL;
 
-public class TestHttpJRE {
+public class TestHttpJRE implements TestHttpAgent {
 
-    public static void main(String[] args) throws Exception {
-        if (args.length < 2) {
-            System.out.println("Usage: <target URI> <no of requests>");
-            System.exit(-1);
-        }
-        URI targetURI = new URI(args[0]);
-        int n = Integer.parseInt(args[1]);
-       
-        URL url = targetURI.toURL();
-       
-        byte[] buffer = new byte[4096];
-       
-        long startTime;
-        long finishTime;
+    public TestHttpJRE() {
+        super();
+    }
+    
+    public Stats execute(final URI targetURI, byte[] content, int n) throws Exception {
+
+        Stats stats = new Stats();
+        
         int successCount = 0;
         int failureCount = 0;
-        String serverName = "unknown";
-        long total = 0;
         long contentLen = 0;
         long totalContentLen = 0;
-       
-        startTime = System.currentTimeMillis();
+        
+        byte[] buffer = new byte[4096];
+        
+        URL url = targetURI.toURL();
         for (int i = 0; i < n; i++) {
             HttpURLConnection c = (HttpURLConnection) url.openConnection();
-            c.connect();
+            
+            if (content != null) {
+                c.setRequestMethod("POST");
+                c.setFixedLengthStreamingMode(content.length);
+                c.setUseCaches (false);
+                c.setDoInput(true);
+                c.setDoOutput(true);
+                OutputStream out = c.getOutputStream();
+                out.write(content);
+                out.flush ();
+                out.close();
+            }
             InputStream instream = c.getInputStream();
             try {
                 contentLen = 0;
                 if (instream != null) {
                     int l = 0;
                     while ((l = instream.read(buffer)) != -1) {
-                        total += l;
                         contentLen += l;
                     }
                 }
@@ -79,40 +84,43 @@
             }
             String s = c.getHeaderField("Server");
             if (s != null) {
-                serverName = s;                
+                stats.setServerName(s);
             }
         }
-        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)");
+        stats.setSuccessCount(successCount);
+        stats.setFailureCount(failureCount);
+        stats.setContentLen(contentLen);
+        stats.setTotalContentLen(totalContentLen);
+        return stats;
     }
  
+    public Stats get(final URI target, int n) throws Exception {
+        return execute(target, null, n);
+    }
+    
+    public Stats post(final URI target, byte[] content, int n) throws Exception {
+        return execute(target, content, n);
+    }
+    
+    public String getClientName() {
+        return "JRE HTTP " + System.getProperty("java.version");
+    }
+
+    public static void main(String[] args) throws Exception {
+        if (args.length < 2) {
+            System.out.println("Usage: <target URI> <no of requests>");
+            System.exit(-1);
+        }
+        URI targetURI = new URI(args[0]);
+        int n = Integer.parseInt(args[1]);
+
+        TestHttpJRE test = new TestHttpJRE(); 
+        
+        long startTime = System.currentTimeMillis();
+        Stats stats = test.get(targetURI, n);
+        long finishTime = System.currentTimeMillis();
+       
+        Stats.printStats(targetURI, startTime, finishTime, stats);
+    }
+   
 } 
\ No newline at end of file