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/02/15 21:06:25 UTC
svn commit: r910324 - in /httpcomponents/httpcore/trunk/httpcore-benchmark:
./ src/main/java/org/apache/http/benchmark/
src/main/java/org/apache/http/benchmark/httpcore/
src/main/java/org/apache/http/benchmark/jetty/
Author: olegk
Date: Mon Feb 15 20:06:25 2010
New Revision: 910324
URL: http://svn.apache.org/viewvc?rev=910324&view=rev
Log:
HTTPCORE-178: NIO benchmarks
Added:
httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreNIOServer.java (with props)
httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NHttpListener.java (with props)
httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NRandomDataHandler.java (with props)
httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/JettyNIOServer.java (with props)
Modified:
httpcomponents/httpcore/trunk/httpcore-benchmark/pom.xml
httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/Benchmark.java
httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreServer.java
httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/RandomDataHandler.java
httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/RandomDataHandler.java
Modified: httpcomponents/httpcore/trunk/httpcore-benchmark/pom.xml
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-benchmark/pom.xml?rev=910324&r1=910323&r2=910324&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-benchmark/pom.xml (original)
+++ httpcomponents/httpcore/trunk/httpcore-benchmark/pom.xml Mon Feb 15 20:06:25 2010
@@ -57,11 +57,23 @@
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpcore-nio</artifactId>
+ <version>${pom.version}</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore-ab</artifactId>
<version>${pom.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
+ <groupId>commons-cli</groupId>
+ <artifactId>commons-cli</artifactId>
+ <version>1.2</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>7.0.1.v20091125</version>
Modified: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/Benchmark.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/Benchmark.java?rev=910324&r1=910323&r2=910324&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/Benchmark.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/Benchmark.java Mon Feb 15 20:06:25 2010
@@ -33,11 +33,13 @@
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
+import org.apache.http.benchmark.httpcore.HttpCoreNIOServer;
import org.apache.http.benchmark.httpcore.HttpCoreServer;
+import org.apache.http.benchmark.jetty.JettyNIOServer;
import org.apache.http.benchmark.jetty.JettyServer;
-import org.apache.http.contrib.benchmark.CommandLineUtils;
-import org.apache.http.contrib.benchmark.Config;
-import org.apache.http.contrib.benchmark.HttpBenchmark;
+import org.apache.http.benchmark.CommandLineUtils;
+import org.apache.http.benchmark.Config;
+import org.apache.http.benchmark.HttpBenchmark;
public class Benchmark {
@@ -68,6 +70,8 @@
Benchmark benchmark = new Benchmark();
benchmark.run(new JettyServer(PORT), config);
benchmark.run(new HttpCoreServer(PORT), config);
+ benchmark.run(new JettyNIOServer(PORT), config);
+ benchmark.run(new HttpCoreNIOServer(PORT), config);
}
public Benchmark() {
Added: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreNIOServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreNIOServer.java?rev=910324&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreNIOServer.java (added)
+++ httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreNIOServer.java Mon Feb 15 20:06:25 2010
@@ -0,0 +1,140 @@
+/*
+ * ====================================================================
+ * 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.benchmark.httpcore;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import org.apache.http.HttpResponseInterceptor;
+import org.apache.http.benchmark.HttpServer;
+import org.apache.http.impl.DefaultConnectionReuseStrategy;
+import org.apache.http.impl.DefaultHttpResponseFactory;
+import org.apache.http.impl.nio.DefaultServerIOEventDispatch;
+import org.apache.http.impl.nio.reactor.DefaultListeningIOReactor;
+import org.apache.http.nio.protocol.AsyncNHttpServiceHandler;
+import org.apache.http.nio.protocol.NHttpRequestHandlerRegistry;
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.ListeningIOReactor;
+import org.apache.http.params.CoreConnectionPNames;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpParams;
+import org.apache.http.params.SyncBasicHttpParams;
+import org.apache.http.protocol.HttpProcessor;
+import org.apache.http.protocol.ImmutableHttpProcessor;
+import org.apache.http.protocol.ResponseConnControl;
+import org.apache.http.protocol.ResponseContent;
+import org.apache.http.protocol.ResponseDate;
+import org.apache.http.protocol.ResponseServer;
+import org.apache.http.util.VersionInfo;
+
+public class HttpCoreNIOServer implements HttpServer {
+
+ private final NHttpListener listener;
+
+ public HttpCoreNIOServer(int port) throws IOException {
+ if (port <= 0) {
+ throw new IllegalArgumentException("Server port may not be negative or null");
+ }
+
+ HttpParams params = new SyncBasicHttpParams();
+ params
+ .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000)
+ .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 12 * 1024)
+ .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
+ .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "HttpCore-NIO-Test/1.1");
+
+ HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpResponseInterceptor[] {
+ new ResponseDate(),
+ new ResponseServer(),
+ new ResponseContent(),
+ new ResponseConnControl()
+ });
+
+ AsyncNHttpServiceHandler handler = new AsyncNHttpServiceHandler(
+ httpproc,
+ new DefaultHttpResponseFactory(),
+ new DefaultConnectionReuseStrategy(),
+ params);
+
+ NHttpRequestHandlerRegistry reqistry = new NHttpRequestHandlerRegistry();
+ reqistry.register("/rnd", new NRandomDataHandler());
+ handler.setHandlerResolver(reqistry);
+
+ ListeningIOReactor ioreactor = new DefaultListeningIOReactor(2, params);
+ ioreactor.listen(new InetSocketAddress(port));
+
+ IOEventDispatch ioEventDispatch = new DefaultServerIOEventDispatch(handler, params);
+ this.listener = new NHttpListener(ioreactor, ioEventDispatch);
+ }
+
+ public String getName() {
+ return "HttpCore (NIO)";
+ }
+
+ public String getVersion() {
+ VersionInfo vinfo = VersionInfo.loadVersionInfo("org.apache.http",
+ Thread.currentThread().getContextClassLoader());
+ return vinfo.getRelease();
+ }
+
+ public void start() throws Exception {
+ this.listener.start();
+ }
+
+ public void shutdown() {
+ this.listener.terminate();
+ try {
+ this.listener.awaitTermination(1000);
+ } catch (InterruptedException ex) {
+ }
+ Exception ex = this.listener.getException();
+ if (ex != null) {
+ System.out.println("Error: " + ex.getMessage());
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ if (args.length != 1) {
+ System.out.println("Usage: <port>");
+ System.exit(1);
+ }
+ int port = Integer.parseInt(args[0]);
+ final HttpCoreNIOServer server = new HttpCoreNIOServer(port);
+ System.out.println("Listening on port: " + port);
+ server.start();
+
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+
+ @Override
+ public void run() {
+ server.shutdown();
+ }
+
+ });
+ }
+
+}
Propchange: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreNIOServer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreNIOServer.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreServer.java?rev=910324&r1=910323&r2=910324&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreServer.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/HttpCoreServer.java Mon Feb 15 20:06:25 2010
@@ -112,12 +112,20 @@
this.listener.awaitTermination(1000);
} catch (InterruptedException ex) {
}
+ Exception ex = this.listener.getException();
+ if (ex != null) {
+ System.out.println("Error: " + ex.getMessage());
+ }
while (!this.workers.isEmpty()) {
HttpWorker worker = this.workers.remove();
worker.terminate();
try {
worker.awaitTermination(1000);
- } catch (InterruptedException ex) {
+ } catch (InterruptedException iex) {
+ }
+ ex = worker.getException();
+ if (ex != null) {
+ System.out.println("Error: " + ex.getMessage());
}
}
}
Added: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NHttpListener.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NHttpListener.java?rev=910324&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NHttpListener.java (added)
+++ httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NHttpListener.java Mon Feb 15 20:06:25 2010
@@ -0,0 +1,72 @@
+/*
+ * ====================================================================
+ * 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.benchmark.httpcore;
+
+import java.io.IOException;
+
+import org.apache.http.nio.reactor.IOEventDispatch;
+import org.apache.http.nio.reactor.IOReactor;
+
+public class NHttpListener extends Thread {
+
+ private final IOReactor ioreactor;
+ private final IOEventDispatch ioEventDispatch;
+
+ private volatile Exception exception;
+
+ public NHttpListener(
+ final IOReactor ioreactor, final IOEventDispatch ioEventDispatch) throws IOException {
+ super();
+ this.ioreactor = ioreactor;
+ this.ioEventDispatch = ioEventDispatch;
+ }
+
+ @Override
+ public void run() {
+ try {
+ this.ioreactor.execute(this.ioEventDispatch);
+ } catch (Exception ex) {
+ this.exception = ex;
+ }
+ }
+
+ public void terminate() {
+ try {
+ this.ioreactor.shutdown();
+ } catch (IOException ex) {
+ }
+ }
+
+ public Exception getException() {
+ return this.exception;
+ }
+
+ public void awaitTermination(long millis) throws InterruptedException {
+ this.join(millis);
+ }
+
+}
Propchange: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NHttpListener.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NHttpListener.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NRandomDataHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NRandomDataHandler.java?rev=910324&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NRandomDataHandler.java (added)
+++ httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NRandomDataHandler.java Mon Feb 15 20:06:25 2010
@@ -0,0 +1,203 @@
+/*
+ * ====================================================================
+ * 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.benchmark.httpcore;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.Locale;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.MethodNotSupportedException;
+import org.apache.http.entity.AbstractHttpEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.nio.ContentEncoder;
+import org.apache.http.nio.IOControl;
+import org.apache.http.nio.entity.BufferingNHttpEntity;
+import org.apache.http.nio.entity.ConsumingNHttpEntity;
+import org.apache.http.nio.entity.ProducingNHttpEntity;
+import org.apache.http.nio.protocol.NHttpRequestHandler;
+import org.apache.http.nio.protocol.NHttpResponseTrigger;
+import org.apache.http.nio.util.HeapByteBufferAllocator;
+import org.apache.http.protocol.HttpContext;
+
+class NRandomDataHandler implements NHttpRequestHandler {
+
+ public NRandomDataHandler() {
+ super();
+ }
+
+ public ConsumingNHttpEntity entityRequest(
+ final HttpEntityEnclosingRequest request,
+ final HttpContext context) throws HttpException, IOException {
+ // Use buffering entity for simplicity
+ return new BufferingNHttpEntity(request.getEntity(), new HeapByteBufferAllocator());
+ }
+
+ public void handle(
+ final HttpRequest request,
+ final HttpResponse response,
+ final NHttpResponseTrigger trigger,
+ final HttpContext context) throws HttpException, IOException {
+ String method = request.getRequestLine().getMethod().toUpperCase(Locale.ENGLISH);
+ if (!method.equals("GET") && !method.equals("HEAD") && !method.equals("POST")) {
+ throw new MethodNotSupportedException(method + " method not supported");
+ }
+ if (request instanceof HttpEntityEnclosingRequest) {
+ HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
+ entity.consumeContent();
+ }
+ String target = request.getRequestLine().getUri();
+
+ int count = 100;
+
+ int idx = target.indexOf('?');
+ if (idx != -1) {
+ String s = target.substring(idx + 1);
+ if (s.startsWith("c=")) {
+ s = s.substring(2);
+ try {
+ count = Integer.parseInt(s);
+ } catch (NumberFormatException ex) {
+ response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
+ response.setEntity(new StringEntity("Invalid query format: " + s,
+ "text/plain", "ASCII"));
+ return;
+ }
+ }
+ }
+ response.setStatusCode(HttpStatus.SC_OK);
+ RandomEntity body = new RandomEntity(count);
+ response.setEntity(body);
+ trigger.submitResponse(response);
+ }
+
+
+
+ public void handle(
+ final HttpRequest request,
+ final HttpResponse response,
+ final HttpContext context) throws HttpException, IOException {
+ String method = request.getRequestLine().getMethod().toUpperCase(Locale.ENGLISH);
+ if (!method.equals("GET") && !method.equals("HEAD") && !method.equals("POST")) {
+ throw new MethodNotSupportedException(method + " method not supported");
+ }
+ if (request instanceof HttpEntityEnclosingRequest) {
+ HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
+ entity.consumeContent();
+ }
+ String target = request.getRequestLine().getUri();
+
+ int count = 100;
+
+ int idx = target.indexOf('?');
+ if (idx != -1) {
+ String s = target.substring(idx + 1);
+ if (s.startsWith("c=")) {
+ s = s.substring(2);
+ try {
+ count = Integer.parseInt(s);
+ } catch (NumberFormatException ex) {
+ response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
+ response.setEntity(new StringEntity("Invalid query format: " + s,
+ "text/plain", "ASCII"));
+ return;
+ }
+ }
+ }
+ response.setStatusCode(HttpStatus.SC_OK);
+ RandomEntity body = new RandomEntity(count);
+ response.setEntity(body);
+ }
+
+ static class RandomEntity extends AbstractHttpEntity implements ProducingNHttpEntity {
+
+ private final int count;
+ private final ByteBuffer buf;
+
+ private int remaining;
+
+ public RandomEntity(int count) {
+ super();
+ this.count = count;
+ this.remaining = count;
+ this.buf = ByteBuffer.allocate(1024);
+ setContentType("text/plain");
+ }
+
+ public InputStream getContent() throws IOException, IllegalStateException {
+ throw new IllegalStateException("Method not supported");
+ }
+
+ public long getContentLength() {
+ return this.count;
+ }
+
+ public boolean isRepeatable() {
+ return true;
+ }
+
+ public boolean isStreaming() {
+ return false;
+ }
+
+ public void writeTo(final OutputStream outstream) throws IOException {
+ throw new IllegalStateException("Method not supported");
+ }
+
+ public void produceContent(
+ final ContentEncoder encoder, final IOControl ioctrl) throws IOException {
+ int r = Math.abs(this.buf.hashCode());
+ int chunk = Math.min(this.buf.remaining(), this.remaining);
+ if (chunk > 0) {
+ for (int i = 0; i < chunk; i++) {
+ byte b = (byte) ((r + i) % 96 + 32);
+ this.buf.put(b);
+ }
+ }
+ this.buf.flip();
+ int bytesWritten = encoder.write(this.buf);
+ this.remaining -= bytesWritten;
+ if (this.remaining == 0 && this.buf.remaining() == 0) {
+ encoder.complete();
+ }
+ this.buf.compact();
+ }
+
+ public void finish() throws IOException {
+ this.remaining = this.count;
+ }
+
+ }
+
+}
\ No newline at end of file
Propchange: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NRandomDataHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/NRandomDataHandler.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/RandomDataHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/RandomDataHandler.java?rev=910324&r1=910323&r2=910324&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/RandomDataHandler.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/httpcore/RandomDataHandler.java Mon Feb 15 20:06:25 2010
@@ -30,7 +30,6 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
-import java.util.Random;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
@@ -89,10 +88,12 @@
static class RandomEntity extends AbstractHttpEntity {
private int count;
+ private final byte[] buf;
public RandomEntity(int count) {
super();
this.count = count;
+ this.buf = new byte[1024];
setContentType("text/plain");
}
@@ -113,19 +114,14 @@
}
public void writeTo(final OutputStream outstream) throws IOException {
- Random rnd = new Random(System.currentTimeMillis());
- byte[] tmp = new byte[1024];
+ int r = Math.abs(this.buf.hashCode());
int remaining = this.count;
while (remaining > 0) {
- int chunk = Math.min(tmp.length, remaining);
+ int chunk = Math.min(this.buf.length, remaining);
for (int i = 0; i < chunk; i++) {
- byte ch = (byte) (Math.abs(rnd.nextInt()) % 127);
- if (ch < 32) {
- ch = ' ';
- }
- tmp[i] = ch;
+ this.buf[i] = (byte) ((r + i) % 96 + 32);
}
- outstream.write(tmp, 0, chunk);
+ outstream.write(this.buf, 0, chunk);
remaining -= chunk;
}
}
Added: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/JettyNIOServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/JettyNIOServer.java?rev=910324&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/JettyNIOServer.java (added)
+++ httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/JettyNIOServer.java Mon Feb 15 20:06:25 2010
@@ -0,0 +1,99 @@
+/*
+ * ====================================================================
+ * 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.benchmark.jetty;
+
+import java.io.IOException;
+
+import org.apache.http.benchmark.HttpServer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.nio.SelectChannelConnector;
+
+public class JettyNIOServer implements HttpServer {
+
+ private final Server server;
+
+ public JettyNIOServer(int port) throws IOException {
+ super();
+ if (port <= 0) {
+ throw new IllegalArgumentException("Server port may not be negative or null");
+ }
+
+ SelectChannelConnector connector = new SelectChannelConnector();
+ connector.setPort(port);
+ connector.setRequestBufferSize(12 * 1024);
+ connector.setResponseBufferSize(12 * 1024);
+
+ this.server = new Server();
+ this.server.addConnector(connector);
+ this.server.setHandler(new RandomDataHandler());
+ }
+
+ public String getName() {
+ return "Jetty (NIO)";
+ }
+
+ public String getVersion() {
+ return Server.getVersion();
+ }
+
+ public void start() throws Exception {
+ this.server.start();
+ }
+
+ public void shutdown() {
+ try {
+ this.server.stop();
+ } catch (Exception ex) {
+ }
+ try {
+ this.server.join();
+ } catch (InterruptedException ex) {
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ if (args.length != 1) {
+ System.out.println("Usage: <port>");
+ System.exit(1);
+ }
+ int port = Integer.parseInt(args[0]);
+ final JettyNIOServer server = new JettyNIOServer(port);
+ System.out.println("Listening on port: " + port);
+ server.start();
+
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+
+ @Override
+ public void run() {
+ server.shutdown();
+ }
+
+ });
+ }
+
+}
Propchange: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/JettyNIOServer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/JettyNIOServer.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/RandomDataHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/RandomDataHandler.java?rev=910324&r1=910323&r2=910324&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/RandomDataHandler.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-benchmark/src/main/java/org/apache/http/benchmark/jetty/RandomDataHandler.java Mon Feb 15 20:06:25 2010
@@ -29,7 +29,6 @@
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
-import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@@ -79,17 +78,13 @@
response.setContentLength(count);
OutputStream outstream = response.getOutputStream();
- Random rnd = new Random(System.currentTimeMillis());
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++) {
- byte ch = (byte) (Math.abs(rnd.nextInt()) % 127);
- if (ch < 32) {
- ch = ' ';
- }
- tmp[i] = ch;
+ tmp[i] = (byte) ((r + i) % 96 + 32);
}
outstream.write(tmp, 0, chunk);
remaining -= chunk;