Browse Source

finalize vertx benchmark for version 3.1.0

removed mongo and template dependencies since we are running plaintext and json tests only
Jebb Q Stewart 10 years ago
parent
commit
ae356b269a

+ 6 - 40
frameworks/Java/vertx/README.md

@@ -1,6 +1,8 @@
-# Vertx 2.x Benchmarking Test
+# Vertx Benchmarking Test
 
-This is the vertx 2.x portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+This is the vertx portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+Minimal attempts have been made for performance. 
 
 ### Plaintext Test
 
@@ -10,27 +12,11 @@ This is the vertx 2.x portion of a [benchmarking test suite](../) comparing a va
 
 * [JSON test source](WebServer.java)
 
-### Database Single query Test
-
-* [Database Single query test source](WebServer.java)
-
-### Database Multiple queries Test
-
-* [Database Multiple queries test source](WebServer.java)
-
-### Database Data updates Test
-
-* [Database Data updates test source](WebServer.java)
-
-### Fortunes Test
-
-* [Fortunes test source](WebServer.java)
 
 ## Versions
 
-* [Java OpenJDK 1.7.0_79](http://openjdk.java.net/)
-* [vertx 2.1.5](http://vertx.io/)
-
+* [Java OpenJDK 1.8](http://openjdk.java.net/)
+* [vertx 3.1.0](http://vertx.io/)
 
 ## Test URLs
 
@@ -41,23 +27,3 @@ This is the vertx 2.x portion of a [benchmarking test suite](../) comparing a va
 ### JSON Encoding Test
 
     http://localhost:8080/json
-
-### Database Mapping Test
-
-    http://localhost:8080/db?queries=5
-
-### Database Single query Test
-
-    http://localhost:8080/db
-
-### Database Multiple queries Test
-
-    http://localhost:8080/queries?queries=5
-
-### Database Data updates Test
-
-    http://localhost:8080/updates?queries=3
-
-### Fortunes Test
-
-    http://localhost:8080/fortunes

+ 0 - 289
frameworks/Java/vertx/WebServer.java

@@ -1,289 +0,0 @@
-import org.vertx.java.core.Handler;
-import org.vertx.java.core.buffer.Buffer;
-import org.vertx.java.core.eventbus.Message;
-import org.vertx.java.core.http.HttpServerRequest;
-import org.vertx.java.core.http.HttpServerResponse;
-import org.vertx.java.core.json.JsonArray;
-import org.vertx.java.core.json.JsonObject;
-import org.vertx.java.core.json.impl.Json;
-import org.vertx.java.platform.Verticle;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Random;
-import java.util.concurrent.ThreadLocalRandom;
-
-import freemarker.template.Template;
-import freemarker.template.Configuration;
-import java.io.StringReader;
-import java.io.Writer;
-import java.io.StringWriter;
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.ArrayList;
-
-public class WebServer extends Verticle implements Handler<HttpServerRequest> {
-
-  private final Buffer helloWorldBuffer = new Buffer("Hello, World!");
-  private final String helloWorldContentLength = String.valueOf(helloWorldBuffer.length());
-  private final DateFormat DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyyy HH:mm:ss z");
-  private final Random random = ThreadLocalRandom.current();
-  private String dateString;
-
-  private static final String PATH_PLAINTEXT = "/plaintext";
-  private static final String PATH_JSON = "/json";
-  private static final String PATH_DB = "/db";
-  private static final String PATH_QUERIES = "/queries";
-  private static final String PATH_UPDATES = "/updates";
-  private static final String PATH_FORTUNES = "/fortunes";
-  private static final String RESPONSE_TYPE_PLAIN = "text/plain";
-  private static final String RESPONSE_TYPE_HTML = "text/html";
-  private static final String RESPONSE_TYPE_JSON = "application/json";
-  private static final String HEADER_CONTENT_TYPE = "Content-Type";
-  private static final String HEADER_CONTENT_LENGTH = "Content-Length";
-  private static final String HEADER_SERVER = "Server";
-  private static final String HEADER_SERVER_VERTX = "vert.x";
-  private static final String HEADER_DATE = "Date";
-  private static final String MONGO_ADDRESS = "hello.persistor";
-  private static final String FREEMARKER_ADDRESS = "vertx.freemarker";
-  private static final String UNDERSCORE_ID = "_id";
-  private static final String TEXT_ID = "id";
-  private static final String RANDOM_NUMBER = "randomNumber";
-  private static final String TEXT_RESULT = "result";
-  private static final String TEXT_RESULTS = "results";
-  private static final String TEXT_QUERIES = "queries";
-  private static final String TEXT_MESSAGE = "message";
-  private static final String TEXT_MESSAGES = "messages";
-  private static final String ADD_FORTUNE_MESSAGE = "Additional fortune added at request time.";
-  private static final String HELLO_WORLD = "Hello, world!";
-  private static final String TEXT_ACTION = "action";
-  private static final String TEXT_CRITERIA = "criteria";
-  private static final String TEXT_UPDATE = "update";
-  private static final String TEXT_OBJ_NEW = "objNew";
-  private static final String TEXT_FINDONE = "findone";
-  private static final String TEXT_FIND = "find";
-  private static final String TEXT_COLLECTION = "collection";
-  private static final String TEXT_WORLD = "World";
-  private static final String TEXT_FORTUNE = "Fortune";
-  private static final String TEXT_MATCHER = "matcher";
-  private static final String TEMPLATE_FORTUNE = "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr><#list messages as message><tr><td>${message.id?html}</td><td>${message.message?html}</td></tr></#list></table></body></html>";
-  
-  private Template ftlTemplate;
-
-  @Override
-  public void start() {
-    try { ftlTemplate = new Template(TEXT_FORTUNE, new StringReader(TEMPLATE_FORTUNE), new Configuration(Configuration.VERSION_2_3_22)); } catch (Exception ex) { ex.printStackTrace(); }
-    vertx.createHttpServer().requestHandler(WebServer.this).listen(8080);
-    vertx.setPeriodic(1000, new Handler<Long>() {
-      @Override
-      public void handle(Long timerID) {
-        formatDate();
-      }
-    });
-    formatDate();
-  }
-
-  @Override
-  public void handle(HttpServerRequest req) {
-    switch (req.path()) {
-      case PATH_PLAINTEXT:
-        handlePlainText(req);
-        break;
-      case PATH_JSON:
-        handleJson(req);
-        break;
-      case PATH_DB:
-        handleDbMongo(req);
-        break;
-      case PATH_QUERIES:
-        handleDBMongo(req,false);
-        break;
-      case PATH_UPDATES:
-        handleDBMongo(req,true);
-        break;
-      case PATH_FORTUNES:
-        handleFortunes(req);
-        break;
-      default:
-        req.response().setStatusCode(404);
-        req.response().end();
-    }
-  }
-
-  private void formatDate() {
-    dateString = DATE_FORMAT.format(new Date());
-  }
-
-  private void handleFortunes(HttpServerRequest req) {
-    final HttpServerResponse resp = req.response();
-    
-    vertx.eventBus().send(
-      MONGO_ADDRESS,
-      new JsonObject()
-          .putString(TEXT_ACTION, TEXT_FIND)
-          .putString(TEXT_COLLECTION, TEXT_FORTUNE),
-      new Handler<Message<JsonObject>>() {
-        @Override
-        public void handle(Message<JsonObject> reply) {
-          JsonArray results = reply.body().getArray(TEXT_RESULTS);
-          
-          List<Fortune> fortunes = new ArrayList<>();
-          for (Object fortune: results) {
-            fortunes.add(new Fortune(
-              ((JsonObject)fortune).getNumber(TEXT_ID).intValue(),
-              ((JsonObject)fortune).getString(TEXT_MESSAGE)));
-          }            
-          fortunes.add(new Fortune(0, ADD_FORTUNE_MESSAGE));
-          Collections.sort(fortunes);
-
-          Map model = new HashMap();
-          model.put(TEXT_MESSAGES, fortunes);
-          Writer writer = new StringWriter();
-          try { ftlTemplate.process(model, writer); } catch (Exception ex) { ex.printStackTrace(); }
-
-          Buffer buff = new Buffer(writer.toString());
-          setHeaders(resp, RESPONSE_TYPE_HTML, String.valueOf(buff.length()));
-          resp.end(buff);
-        }  
-    });
-  }
-
-  private void handlePlainText(HttpServerRequest req) {
-    HttpServerResponse resp = req.response();
-    setHeaders(resp, RESPONSE_TYPE_PLAIN, helloWorldContentLength);
-    resp.end(helloWorldBuffer);
-  }
-
-  private void handleJson(HttpServerRequest req) {
-    Buffer buff = new Buffer(Json.encode(Collections.singletonMap(TEXT_MESSAGE, HELLO_WORLD)));
-    HttpServerResponse resp = req.response();
-    setHeaders(resp, RESPONSE_TYPE_JSON, String.valueOf(buff.length()));
-    resp.end(buff);
-  }
-
-  private void handleDbMongo(final HttpServerRequest req) {
-    findRandom(new Handler<Message<JsonObject>>() {
-      @Override
-      public void handle(Message<JsonObject> reply) {
-        JsonObject world = getResultFromReply(reply);
-        String result = world.encode();
-        sendResponse(req, result);
-      }
-    });
-  }
-
-  private JsonObject getResultFromReply(Message<JsonObject> reply) {
-    JsonObject body = reply.body();
-    JsonObject world = body.getObject(TEXT_RESULT);
-    Object id = world.removeField(UNDERSCORE_ID);
-    world.putValue(TEXT_ID, Integer.valueOf(((Double)id).intValue()));
-    return world;
-  }
-
-  private void handleDBMongo(final HttpServerRequest req, boolean randomUpdates) {
-    int queriesParam = 1;
-    try {
-      queriesParam = Integer.parseInt(req.params().get(TEXT_QUERIES));
-    } catch (NumberFormatException e) {
-      queriesParam = 1;
-    }
-    if (queriesParam < 1) {
-      queriesParam = 1;
-    } else if (queriesParam > 500) {
-      queriesParam = 500;
-    }
-    final MongoHandler dbh = new MongoHandler(req, queriesParam, randomUpdates);
-    for (int i = 0; i < queriesParam; i++) {
-      findRandom(dbh);
-    }
-  }
-
-  private void findRandom(Handler<Message<JsonObject>> handler) {
-    vertx.eventBus().send(
-        MONGO_ADDRESS,
-        new JsonObject()
-            .putString(TEXT_ACTION, TEXT_FINDONE)
-            .putString(TEXT_COLLECTION, TEXT_WORLD)
-            .putObject(TEXT_MATCHER, new JsonObject().putNumber(UNDERSCORE_ID, (random.nextInt(10000) + 1))),
-        handler);
-  }
-
-  private void updateRandom(JsonObject json) {
-    vertx.eventBus().send(
-        MONGO_ADDRESS,
-        new JsonObject()
-            .putString(TEXT_ACTION, TEXT_UPDATE)
-            .putString(TEXT_COLLECTION, TEXT_WORLD)
-            .putObject(TEXT_CRITERIA, new JsonObject().putValue(UNDERSCORE_ID, json.getValue(TEXT_ID)))
-            .putObject(TEXT_OBJ_NEW, json)
-             );
-  }
-
-  private void sendResponse(HttpServerRequest req, String result) {
-    Buffer buff = new Buffer(result);
-    HttpServerResponse resp = req.response();
-    setHeaders(resp, RESPONSE_TYPE_JSON, String.valueOf(buff.length()));
-    resp.end(buff);
-  }
-
-  private void setHeaders(HttpServerResponse resp, String contentType, String contentLength) {
-    resp.putHeader(HEADER_CONTENT_TYPE, contentType);
-    resp.putHeader(HEADER_CONTENT_LENGTH, contentLength);
-    resp.putHeader(HEADER_SERVER, HEADER_SERVER_VERTX );
-    resp.putHeader(HEADER_DATE, dateString);
-  }
-
-  private final class MongoHandler implements Handler<Message<JsonObject>> {
-    private final HttpServerRequest req;
-    private final int queries;
-    private final JsonArray worlds;
-    private final Random random;
-    private final boolean randomUpdates;
-
-    public MongoHandler(HttpServerRequest request, int queriesParam, boolean performRandomUpdates) {
-      req = request;
-      queries = queriesParam;
-      randomUpdates = performRandomUpdates;
-      random = ThreadLocalRandom.current();
-      worlds = new JsonArray();
-    }
-    @Override
-    public void handle(Message<JsonObject> reply) {
-      JsonObject world = getResultFromReply(reply);
-      if (randomUpdates) {
-        world.putValue(RANDOM_NUMBER, (random.nextInt(10000) + 1));
-        updateRandom(world);        
-      }
-      worlds.add(world);
-      if (worlds.size() == this.queries) {
-        // All queries have completed; send the response.
-        String result = worlds.encode();
-        sendResponse(req, result);
-      }
-    }
-  }
-  
-  public final class Fortune implements Comparable<Fortune> {
-    public int id;
-    public String message;
-
-    public int getId() {
-      return id;
-    }
-    public String getMessage() {
-      return message;
-    }
-    public Fortune(int id, String message) {
-      this.id = id;
-      this.message = message;
-    }
-    @Override
-    public int compareTo(Fortune other) {
-      return message.compareTo(other.message);
-    }
-  }  
-}
-

+ 0 - 16
frameworks/Java/vertx/app.js

@@ -1,16 +0,0 @@
-var container = require('vertx/container')
-
-var persistorConf = {
-  address: 'hello.persistor',
-  db_name: 'hello_world',
-  host: '127.0.0.1',
-  pool_size: 100
-}
-
-container.deployModule('io.vertx~mod-mongo-persistor~2.1.1', persistorConf, function (err, dep_id) {
-  if (!err) {
-    container.deployVerticle('WebServer.java', java.lang.Runtime.getRuntime().availableProcessors() * 2);
-  } else {
-    err.printStackTrace();
-  }
-});

+ 1 - 5
frameworks/Java/vertx/benchmark_config.json

@@ -4,15 +4,11 @@
     "default": {
       "setup_file": "setup",
       "json_url": "/json",
-      "db_url": "/db",
       "plaintext_url": "/plaintext",
-      "query_url": "/queries?queries=",
-      "update_url": "/updates?queries=",
-      "fortune_url": "/fortunes",
       "port": 8080,
       "approach": "Realistic",
       "classification": "Platform",
-      "database": "MongoDB",
+      "database": "None",
       "framework": "vertx",
       "language": "Java",
       "orm": "Raw",

+ 1 - 9
frameworks/Java/vertx/install.sh

@@ -1,12 +1,4 @@
 #!/bin/bash
 
-fw_depends java8
+fw_depends java8 maven
 
-RETCODE=$(fw_exists ${IROOT}/vert.x-2.1.5.installed)
-[ ! "$RETCODE" == 0 ] || { return 0; }
-
-fw_get http://dl.bintray.com/vertx/downloads/vert.x-2.1.5.tar.gz?direct=true -o vert.x-2.1.5.tar.gz
-fw_untar vert.x-2.1.5.tar.gz
-fw_get http://central.maven.org/maven2/org/freemarker/freemarker/2.3.22/freemarker-2.3.22.jar -o $IROOT/vert.x-2.1.5/lib/freemarker-2.3.22.jar
-
-touch $IROOT/vert.x-2.1.5.installed

+ 81 - 0
frameworks/Java/vertx/pom.xml

@@ -0,0 +1,81 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.jebbstewart</groupId>
+	<artifactId>vertx.benchmark</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+
+	<properties>
+		<!-- the main class -->
+		<main.class>vertx.WebServer</main.class>
+		<stack.version>3.1.0</stack.version>
+	</properties>
+
+	<repositories>
+		<repository>
+			<id>sonatype-nexus-snapshots</id>
+			<name>Sonatype Nexus Snapshots</name>
+			<url>https://oss.sonatype.org/content/repositories/snapshots</url>
+			<releases>
+				<enabled>false</enabled>
+			</releases>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+		</repository>
+	</repositories>
+
+
+	<dependencies>
+		<dependency>
+			<groupId>io.vertx</groupId>
+			<artifactId>vertx-core</artifactId>
+			<version>${stack.version}</version>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-shade-plugin</artifactId>
+				<version>2.3</version>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>shade</goal>
+						</goals>
+						<configuration>
+							<transformers>
+								<transformer
+									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+									<manifestEntries>
+										<Main-Class>${main.class}</Main-Class>
+									</manifestEntries>
+								</transformer>
+								<transformer
+									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+									<resource>META-INF/services/io.vertx.core.spi.VerticleFactory</resource>
+								</transformer>
+							</transformers>
+							<artifactSet>
+							</artifactSet>
+							<outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+
+	</build>
+
+</project>

+ 4 - 13
frameworks/Java/vertx/setup.sh

@@ -1,17 +1,8 @@
 #!/bin/bash
-<<<<<<< HEAD
 
-sed -i 's|host: \x27.*\x27|host: \x27'"${DBHOST}"'\x27|g' app.js
+fw_depends java8 maven
 
-fw_depends java7 vertx 
+mvn clean package 
 
-vertx run app.js &
-=======
-# load java environment variables
-source $IROOT/java8.installed
-
-sed -i 's|host: \x27.*\x27|host: \x27'"${DBHOST}"'\x27|g' app.js
-
-export JAVA_OPTS="-server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts"
-${IROOT}/vert.x-2.1.5/bin/vertx run app.js &
->>>>>>> master
+cd target
+java -Xms2G -Xmx2G -server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true -jar vertx.benchmark-0.0.1-SNAPSHOT-fat.jar &

+ 1 - 2
frameworks/Java/vertx/source_code

@@ -1,2 +1 @@
-./vertx/app.js
-./vertx/WebServer.java
+./vertx/src/main/java/vertx/WebServer.java

+ 100 - 0
frameworks/Java/vertx/src/main/java/vertx/WebServer.java

@@ -0,0 +1,100 @@
+package vertx;
+
+import io.vertx.core.AbstractVerticle;
+import io.vertx.core.DeploymentOptions;
+import io.vertx.core.Handler;
+import io.vertx.core.Vertx;
+import io.vertx.core.buffer.Buffer;
+import io.vertx.core.http.HttpServer;
+import io.vertx.core.http.HttpServerRequest;
+import io.vertx.core.json.Json;
+import io.vertx.core.logging.Logger;
+import io.vertx.core.logging.LoggerFactory;
+
+import java.util.Collections;
+
+public class WebServer extends AbstractVerticle implements Handler<HttpServerRequest> {
+
+	static Logger logger = LoggerFactory.getLogger(WebServer.class.getName());
+
+	private static final String PATH_PLAINTEXT = "/plaintext";
+	private static final String PATH_JSON = "/json";
+
+	private static final String RESPONSE_TYPE_PLAIN = "text/plain";
+	private static final String RESPONSE_TYPE_JSON = "application/json";
+
+	private static final String TEXT_MESSAGE = "message";
+	private static final String HELLO_WORLD = "Hello, world!";
+	private static final Buffer HELLO_WORLD_BUFFER = Buffer.buffer(HELLO_WORLD);
+
+	private static final String HEADER_SERVER = "SERVER";
+	private static final String HEADER_DATE = "DATE";
+	private static final String HEADER_CONTENT = "content-type";
+
+	private static final String SERVER = "vertx";
+
+	private String dateString;
+
+	private HttpServer server;
+
+	@Override
+	public void start() {
+
+		int port = 8080;
+
+		server = vertx.createHttpServer();
+
+		server.requestHandler(WebServer.this).listen(port);
+
+		dateString = java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME.format(java.time.ZonedDateTime.now());
+
+		vertx.setPeriodic(1000, handler -> {
+			dateString = java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME.format(java.time.ZonedDateTime.now());
+		});
+	}
+
+	@Override
+	public void handle(HttpServerRequest request) {
+		switch (request.path()) {
+		case PATH_PLAINTEXT:
+			handlePlainText(request);
+			break;
+		case PATH_JSON:
+			handleJson(request);
+			break;
+		default:
+			request.response().setStatusCode(404);
+			request.response().end();
+		}
+	}
+
+	@Override
+	public void stop(){
+		if ( server != null ) server.close();        
+	}
+
+	private void handlePlainText(HttpServerRequest request) {
+		request.response()
+		.putHeader(HEADER_CONTENT, RESPONSE_TYPE_PLAIN).putHeader(HEADER_SERVER,  SERVER)
+		.putHeader(HEADER_DATE, dateString).end(HELLO_WORLD_BUFFER);
+	}
+
+	private void handleJson(HttpServerRequest request) {
+		Buffer buff = Buffer.buffer(Json.encode(Collections.singletonMap(TEXT_MESSAGE, HELLO_WORLD)));
+		request.response().putHeader(HEADER_CONTENT, RESPONSE_TYPE_JSON).putHeader(HEADER_SERVER,  SERVER)
+		.putHeader(HEADER_DATE, dateString).end(buff);
+	}
+	
+	public static void main(String[] args) {
+		int procs = Runtime.getRuntime().availableProcessors();
+		Vertx vertx = Vertx.vertx();
+		vertx.deployVerticle(WebServer.class.getName(), 
+				new DeploymentOptions().setInstances(procs*2), event -> {
+					if (event.succeeded()) {
+						logger.debug("Your Vert.x application is started!");
+					} else {
+						logger.error("Unable to start your application", event.cause());
+					}
+				});
+	}
+}