Echo Benchmark Configuration - RestExpress/RestExpress GitHub Wiki
Compared against NodeJS (version ), Tomcat (version ), Vert.x (version ). Utilized a custom tuned version of HttPerf per the directions at:
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.
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();
}
}
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);
}
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"/>
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);