Skip to content

Commit

Permalink
Adds JMH benchmark module
Browse files Browse the repository at this point in the history
Starts with Contract tests as this was suggested a place we may need
caching.

See #214
  • Loading branch information
Adrian Cole committed Apr 7, 2015
1 parent ca068eb commit 7612e9d
Show file tree
Hide file tree
Showing 6 changed files with 246 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
### Version 8.2
* Adds JMH benchmark module
* Enforces source compatibility with animal-sniffer

### Version 8.1
Expand Down
10 changes: 10 additions & 0 deletions benchmark/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Feign Benchmarks
===================

This module includes [JMH](http://openjdk.java.net/projects/code-tools/jmh/) benchmarks for Feign.

=== Building the benchmark
Install and run `mvn -Dfeign.version=8.1.0` to produce `target/benchmark` pinned to version `8.1.0`

=== Running the benchmark
Execute `target/benchmark`
93 changes: 93 additions & 0 deletions benchmark/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?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.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>9</version>
</parent>

<groupId>com.netflix.feign</groupId>
<artifactId>feign-benchmark</artifactId>
<packaging>jar</packaging>
<version>8.1.0-SNAPSHOT</version>
<name>Feign Benchmark (JMH)</name>

<properties>
<jmh.version>1.8</jmh.version>
</properties>

<dependencies>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-jaxrs</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<defaultGoal>package</defaultGoal>
<plugins>
<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">
<mainClass>org.openjdk.jmh.Main</mainClass>
</transformer>
</transformers>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.skife.maven</groupId>
<artifactId>really-executable-jar-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<programFile>benchmark</programFile>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>really-executable-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
46 changes: 46 additions & 0 deletions benchmark/src/main/java/feign/benchmark/ContractBenchmarks.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package feign.benchmark;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;

import java.util.concurrent.TimeUnit;

import feign.Contract;
import feign.jaxrs.JAXRSContract;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 5, time = 1)
@Fork(3)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Thread)
public class ContractBenchmarks {

private Contract feignContract;
private Contract jaxrsContract;

@Setup
public void setup() {
feignContract = new Contract.Default();
jaxrsContract = new JAXRSContract();
}

@Benchmark
public void parseFeign() {
feignContract.parseAndValidatateMetadata(FeignTestInterface.class);
}

@Benchmark
public void parseJAXRS() {
jaxrsContract.parseAndValidatateMetadata(JAXRSTestInterface.class);
}

}
39 changes: 39 additions & 0 deletions benchmark/src/main/java/feign/benchmark/FeignTestInterface.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package feign.benchmark;

import java.util.List;

import javax.ws.rs.HeaderParam;

import feign.Body;
import feign.Headers;
import feign.Param;
import feign.RequestLine;
import feign.Response;

@Headers("Accept: application/json")
interface FeignTestInterface {

@RequestLine("GET /?Action=GetUser&Version=2010-05-08&limit=1")
Response query();

@RequestLine("GET /domains/{domainId}/records?name={name}&type={type}")
Response mixedParams(@Param("domainId") int id,
@Param("name") String nameFilter,
@Param("type") String typeFilter);

@RequestLine("PATCH /")
Response customMethod();

@RequestLine("PUT /")
@Headers("Content-Type: application/json")
void bodyParam(List<String> body);

@RequestLine("POST /")
@Body("%7B\"customer_name\": \"{customer_name}\", \"user_name\": \"{user_name}\", \"password\": \"{password}\"%7D")
void form(@Param("customer_name") String customer, @Param("user_name") String user,
@Param("password") String password);

@RequestLine("POST /")
@Headers({"Happy: sad", "Auth-Token: {authToken}"})
void headers(@HeaderParam("authToken") String token);
}
57 changes: 57 additions & 0 deletions benchmark/src/main/java/feign/benchmark/JAXRSTestInterface.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package feign.benchmark;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

import feign.Headers;
import feign.Response;

@Consumes("application/json")
interface JAXRSTestInterface {

@GET
@Path("/?Action=GetUser&Version=2010-05-08&limit=1")
Response query();

@GET
@Path("/domains/{domainId}/records")
Response mixedParams(@PathParam("domainId") int id, @QueryParam("name") String nameFilter,
@QueryParam("type") String typeFilter);

@PATCH
Response customMethod();

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
@interface PATCH {

}

@PUT
@Produces("application/json")
void bodyParam(List<String> body);

@POST
void form(@FormParam("customer_name") String customer, @FormParam("user_name") String user,
@FormParam("password") String password);

@POST
@Headers("Happy: sad")
void headers(@HeaderParam("Auth-Token") String token);
}

0 comments on commit 7612e9d

Please sign in to comment.