Explorar el Código

Jooby benchmark

Edgar Espina hace 9 años
padre
commit
cf0872e6ca

+ 46 - 0
frameworks/Java/jooby/README.md

@@ -0,0 +1,46 @@
+# Jooby Benchmarking Test
+
+[Jooby](http://jooby.org) is a micro-web framework for Java.
+
+```java
+public class App extends Jooby {
+
+  {
+    get("/plaintext", () -> "Hello, World!");
+  }
+
+}
+```
+
+This is the [Jooby](http://jooby.org) portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+
+### Plain Text Test
+* [Plain test source](src/main/java/com/techempower/App.java)
+
+### JSON Encoding Test
+* [JSON test source](src/main/java/com/techempower/App.java)
+
+### Single Query Test
+* [Single query test source](src/main/java/com/techempower/App.java)
+
+## Versions
+
+* [Jooby 0.11.x](http://jooby.org)
+* [Undertow 1.2.x](http://undertow.io)
+* [Jackson 2.6.x](http://wiki.fasterxml.com/JacksonHome)
+
+## Test URLs
+
+### Plain Text Test
+
+    http://localhost:8080/plaintext
+
+### JSON Encoding Test
+
+    http://localhost:8080/json
+
+### Single Query Test
+
+    http://localhost:8080/db
+

+ 25 - 0
frameworks/Java/jooby/benchmark_config.json

@@ -0,0 +1,25 @@
+{
+  "framework": "jooby",
+  "tests": [{
+    "default": {
+      "setup_file": "setup",
+      "db_url": "/db",
+      "json_url": "/json",
+      "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Fullstack",
+      "database": "None",
+      "framework": "jooby",
+      "language": "Java",
+      "orm": "Raw",
+      "platform": "Undertow",
+      "webserver": "Undertow",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Jooby",
+      "notes": "",
+      "versus": ""
+    }
+  }]
+}

+ 6 - 0
frameworks/Java/jooby/conf/application.conf

@@ -0,0 +1,6 @@
+application.env = prod
+
+db.url = "jdbc:mysql://"${DBHOST}":3306/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=false&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true"
+db.user = benchmarkdbuser
+db.password = benchmarkdbpass
+hikari.maximumPoolSize = 100

+ 12 - 0
frameworks/Java/jooby/conf/logback.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>[%d{ISO8601}]-[%thread] %-5level %logger - %msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <root level="OFF">
+    <appender-ref ref="STDOUT" />
+  </root>
+</configuration>

+ 102 - 0
frameworks/Java/jooby/pom.xml

@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.jooby</groupId>
+    <artifactId>jooby-project</artifactId>
+    <version>0.11.1</version>
+  </parent>
+
+  <artifactId>jooby</artifactId>
+  <groupId>com.techempower</groupId>
+  <version>1.0</version>
+
+  <name>jooby</name>
+  <description>generated by Jooby archetype</description>
+
+  <properties>
+    <jooby.version>0.11.1</jooby.version>
+
+    <!-- Startup class -->
+    <application.class>com.techempower.App</application.class>
+  </properties>
+
+  <dependencies>
+    <!-- Jooby -->
+    <dependency>
+      <groupId>org.jooby</groupId>
+      <artifactId>jooby</artifactId>
+    </dependency>
+
+    <!-- jackson -->
+    <dependency>
+      <groupId>org.jooby</groupId>
+      <artifactId>jooby-jackson</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.jooby</groupId>
+      <artifactId>jooby-jdbi</artifactId>
+    </dependency>
+
+    <!-- mySQL -->
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+    </dependency>
+
+    <!-- Server -->
+    <dependency>
+      <groupId>org.jooby</groupId>
+      <artifactId>jooby-undertow</artifactId>
+    </dependency>
+
+    <!-- logging -->
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+    </dependency>
+
+    <!-- Tests -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.jooby</groupId>
+      <artifactId>jooby</artifactId>
+      <scope>test</scope>
+      <classifier>tests</classifier>
+    </dependency>
+
+    <!-- Fluent HC -->
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>fluent-hc</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpmime</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+  </dependencies>
+
+  <build>
+    <plugins>
+      <!-- Build fat jar -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

+ 8 - 0
frameworks/Java/jooby/setup.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+
+fw_depends java8 maven
+
+mvn clean package
+
+cd target
+java -server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -jar jooby-1.0.jar &

+ 8 - 0
frameworks/Java/jooby/source_code

@@ -0,0 +1,8 @@
+./jooby/conf/
+./jooby/conf/logback.xml
+./jooby/conf/application.conf
+./jooby/src/
+./jooby/src/main
+./jooby/src/main/java
+./jooby/src/main/java/com/techempower
+./jooby/src/main/java/com/techempower/App.java

+ 87 - 0
frameworks/Java/jooby/src/main/java/com/techempower/App.java

@@ -0,0 +1,87 @@
+package com.techempower;
+
+import org.jooby.Jooby;
+import org.jooby.MediaType;
+import org.jooby.Results;
+import org.jooby.Result;
+import org.jooby.json.Jackson;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Locale;
+import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import org.jooby.jdbi.Jdbi;
+import org.skife.jdbi.v2.Handle;
+import java.util.Random;
+
+/**
+ * @author jooby generator
+ */
+public class App extends Jooby {
+
+  static final DateTimeFormatter fmt = DateTimeFormatter
+      .ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH)
+      .withZone(ZoneId.of("GMT"));
+
+  static final String H_SERVER = "Server";
+  static final String SERVER = "Netty";
+
+  static final String H_DATE= "Date";
+
+  static final String helloWorld = "Hello, World!";
+
+  static final int DB_ROWS = 10000;
+
+  {
+    use(new Jackson());
+    use(new Jdbi());
+
+    get("*", (req, rsp) -> {
+      rsp.header(H_SERVER, SERVER)
+         .header(H_DATE, fmt.format(Instant.ofEpochMilli(System.currentTimeMillis())));
+    });
+
+    /**
+     * Plain text response. Please note all these lines can be just:
+     *
+     *  get("/plaintext", () -> "Hello, World!");
+     *
+     *  This way we will get just a few extra ms.
+     */
+    byte[] plaintextBytes = helloWorld.getBytes(StandardCharsets.UTF_8);
+    Result plaintext = Results
+        .with(plaintextBytes)
+        .type(MediaType.plain);
+
+    get("/plaintext", () -> plaintext);
+
+    /**
+     * json response.
+     */
+    Map<String, Object> hash = new HashMap<>();
+    hash.put("message", helloWorld);
+    Result json = Results
+        .with(hash)
+        .type(MediaType.json);
+
+    get("/json", () -> json);
+
+    get("/db", req -> {
+      try (Handle handle = req.require(Handle.class)) {
+        Random rnd = new Random();
+        int id = rnd.nextInt(DB_ROWS);
+        return handle.createQuery("select * from World where id = :id")
+          .bind("id", id)
+          .map((idx, rs, ctx) -> new World(rs.getInt("id"), rs.getInt("randomNumber")))
+          .first();
+      }
+  });
+  }
+
+  public static void main(final String[] args) throws Exception {
+    new App().start(args);
+  }
+
+}

+ 21 - 0
frameworks/Java/jooby/src/main/java/com/techempower/World.java

@@ -0,0 +1,21 @@
+package com.techempower;
+
+public class World {
+
+  private int id;
+
+  private int randomNumber;
+
+  public World(int id, int randomNumber) {
+    this.id = id;
+    this.randomNumber = randomNumber;
+  }
+
+  public int getId() {
+    return id;
+  }
+
+  public int getRandomNumber() {
+    return randomNumber;
+  }
+}