Echo Benchmark Configuration - RestExpress/RestExpress GitHub Wiki

The Field

Compared against NodeJS (version ), Tomcat (version ), Vert.x (version ). Utilized a custom tuned version of HttPerf per the directions at:

The Machines

Server: Virtual w/ 2 cores and ?? memory
Client: Single core Pentium 4 with 512MB memory

HttPerf was utilized on the client to issue requests to the server. HttpPerf was modified for ports via these directions.

RestExpress

Server code:

package com.strategicgains.restexpress.echo;

import org.jboss.netty.handler.codec.http.HttpMethod;

import com.strategicgains.restexpress.Request;
import com.strategicgains.restexpress.Response;
import com.strategicgains.restexpress.RestExpress;

/**
 * @author toddf
 * @since June 29, 2012
 */
public class Echo
{
	public static void main(String[] args)
	{
		RestExpress server = new RestExpress()
			.setName("Echo");
		
		server.uri("/echo", new Object()
		{
			public String read(Request req, Response res)
			{
				String value = req.getRawHeader("echo");
				res.setContentType("text/xml");
				
				if (value == null)
				{
					return "<http_test><error>no value specified</error></http_test>";
				}
				else
				{
					return String.format("<http_test><value>%s</value></http_test>", value);
				}
			}
		})
		.method(HttpMethod.GET)
		.noSerialization();
		
		server.bind(8000);
		server.awaitShutdown();
	}
}

NodeJS

Server code:

var cluster = require('cluster');
var http = require('http'), url = require('url');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
	cluster.fork();
  }

  cluster.on('death', function(worker) {
	console.log('worker ' + worker.pid + ' died');
  });
} else {
	http.createServer(function(request, response) {
		response.writeHead(200, {"Content-Type":"text/xml"});
		var urlObj = url.parse(request.url, true);
		var value = urlObj.query["value"];
		if (value == ''){
			response.end("<http_test><error>no value specified</error></http_test>");
		} else {
			response.end("<http_test><value>" + value + "</value></http_test>");
		}
	}).listen(8080);
}

Tomcat

Server code:

package ppackage;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EchoServlet
extends HttpServlet 
{
	/**
	 * To get here use something like this:
	 * http://localhost:8081/RegularEchoServlet/EchoServlet?echo=Hello
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		response.setStatus(200);
		response.addHeader("Content-Type", "text/xml");
		String echo = request.getParameter("echo");
				
		if (echo == null)
		{
			response.getOutputStream().print("<http_test><error>no value specified</error></http_test>");
		}
		else
		{
			response.getOutputStream().print(String.format("<http_test><value>%s</value></http_test>", echo));			
		}
	}
}

Web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>RegularEchoServlet</display-name>
  <welcome-file-list>
	<welcome-file>index.html</welcome-file>
	<welcome-file>index.htm</welcome-file>
	<welcome-file>index.jsp</welcome-file>
	<welcome-file>default.html</welcome-file>
	<welcome-file>default.htm</welcome-file>
	<welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
	<description>Regular Echo Servlet using Servlet v25</description>
	<display-name>EchoServlet</display-name>
	<servlet-name>EchoServlet</servlet-name>
	<servlet-class>ppackage.EchoServlet</servlet-class>
  </servlet>
  <servlet-mapping>
	<servlet-name>EchoServlet</servlet-name>
	<url-pattern>/EchoServlet</url-pattern>
  </servlet-mapping>
</web-app>

Use this connector in server.xml:

<Connector connectionTimeout="20000" port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>

Vert.x

Server code:

load('vertx.js');

vertx.createHttpServer().requestHandler(function(req) {
	req.response.putHeader('Content-Type', 'text/xml');
	var value = req.params().value;
	if (value == undefined) {
		req.response.end('<http_test><error>no value specified</error></http_test>');
	} else {
		req.response.end('<http_test><value>' + value + '</value></http_test>');
	}
}).listen(8181);
⚠️ **GitHub.com Fallback** ⚠️