Skip to content

Commit 7612e9d

Browse files
author
Adrian Cole
committed
Adds JMH benchmark module
Starts with Contract tests as this was suggested a place we may need caching. See OpenFeign#214
1 parent ca068eb commit 7612e9d

File tree

6 files changed

+246
-0
lines changed

6 files changed

+246
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
### Version 8.2
2+
* Adds JMH benchmark module
23
* Enforces source compatibility with animal-sniffer
34

45
### Version 8.1

benchmark/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Feign Benchmarks
2+
===================
3+
4+
This module includes [JMH](http://openjdk.java.net/projects/code-tools/jmh/) benchmarks for Feign.
5+
6+
=== Building the benchmark
7+
Install and run `mvn -Dfeign.version=8.1.0` to produce `target/benchmark` pinned to version `8.1.0`
8+
9+
=== Running the benchmark
10+
Execute `target/benchmark`

benchmark/pom.xml

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<parent>
7+
<groupId>org.sonatype.oss</groupId>
8+
<artifactId>oss-parent</artifactId>
9+
<version>9</version>
10+
</parent>
11+
12+
<groupId>com.netflix.feign</groupId>
13+
<artifactId>feign-benchmark</artifactId>
14+
<packaging>jar</packaging>
15+
<version>8.1.0-SNAPSHOT</version>
16+
<name>Feign Benchmark (JMH)</name>
17+
18+
<properties>
19+
<jmh.version>1.8</jmh.version>
20+
</properties>
21+
22+
<dependencies>
23+
<dependency>
24+
<groupId>com.netflix.feign</groupId>
25+
<artifactId>feign-core</artifactId>
26+
<version>${project.version}</version>
27+
</dependency>
28+
<dependency>
29+
<groupId>com.netflix.feign</groupId>
30+
<artifactId>feign-jaxrs</artifactId>
31+
<version>${project.version}</version>
32+
</dependency>
33+
<dependency>
34+
<groupId>javax.ws.rs</groupId>
35+
<artifactId>jsr311-api</artifactId>
36+
<version>1.1.1</version>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.openjdk.jmh</groupId>
40+
<artifactId>jmh-core</artifactId>
41+
<version>${jmh.version}</version>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.openjdk.jmh</groupId>
45+
<artifactId>jmh-generator-annprocess</artifactId>
46+
<version>${jmh.version}</version>
47+
<scope>provided</scope>
48+
</dependency>
49+
</dependencies>
50+
51+
<build>
52+
<defaultGoal>package</defaultGoal>
53+
<plugins>
54+
<plugin>
55+
<groupId>org.apache.maven.plugins</groupId>
56+
<artifactId>maven-shade-plugin</artifactId>
57+
<version>2.3</version>
58+
<executions>
59+
<execution>
60+
<phase>package</phase>
61+
<goals>
62+
<goal>shade</goal>
63+
</goals>
64+
<configuration>
65+
<transformers>
66+
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
67+
<mainClass>org.openjdk.jmh.Main</mainClass>
68+
</transformer>
69+
</transformers>
70+
<createDependencyReducedPom>false</createDependencyReducedPom>
71+
</configuration>
72+
</execution>
73+
</executions>
74+
</plugin>
75+
<plugin>
76+
<groupId>org.skife.maven</groupId>
77+
<artifactId>really-executable-jar-maven-plugin</artifactId>
78+
<version>1.4.0</version>
79+
<configuration>
80+
<programFile>benchmark</programFile>
81+
</configuration>
82+
<executions>
83+
<execution>
84+
<phase>package</phase>
85+
<goals>
86+
<goal>really-executable-jar</goal>
87+
</goals>
88+
</execution>
89+
</executions>
90+
</plugin>
91+
</plugins>
92+
</build>
93+
</project>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package feign.benchmark;
2+
3+
import org.openjdk.jmh.annotations.Benchmark;
4+
import org.openjdk.jmh.annotations.BenchmarkMode;
5+
import org.openjdk.jmh.annotations.Fork;
6+
import org.openjdk.jmh.annotations.Measurement;
7+
import org.openjdk.jmh.annotations.Mode;
8+
import org.openjdk.jmh.annotations.OutputTimeUnit;
9+
import org.openjdk.jmh.annotations.Scope;
10+
import org.openjdk.jmh.annotations.Setup;
11+
import org.openjdk.jmh.annotations.State;
12+
import org.openjdk.jmh.annotations.Warmup;
13+
14+
import java.util.concurrent.TimeUnit;
15+
16+
import feign.Contract;
17+
import feign.jaxrs.JAXRSContract;
18+
19+
@Measurement(iterations = 5, time = 1)
20+
@Warmup(iterations = 5, time = 1)
21+
@Fork(3)
22+
@BenchmarkMode(Mode.Throughput)
23+
@OutputTimeUnit(TimeUnit.SECONDS)
24+
@State(Scope.Thread)
25+
public class ContractBenchmarks {
26+
27+
private Contract feignContract;
28+
private Contract jaxrsContract;
29+
30+
@Setup
31+
public void setup() {
32+
feignContract = new Contract.Default();
33+
jaxrsContract = new JAXRSContract();
34+
}
35+
36+
@Benchmark
37+
public void parseFeign() {
38+
feignContract.parseAndValidatateMetadata(FeignTestInterface.class);
39+
}
40+
41+
@Benchmark
42+
public void parseJAXRS() {
43+
jaxrsContract.parseAndValidatateMetadata(JAXRSTestInterface.class);
44+
}
45+
46+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package feign.benchmark;
2+
3+
import java.util.List;
4+
5+
import javax.ws.rs.HeaderParam;
6+
7+
import feign.Body;
8+
import feign.Headers;
9+
import feign.Param;
10+
import feign.RequestLine;
11+
import feign.Response;
12+
13+
@Headers("Accept: application/json")
14+
interface FeignTestInterface {
15+
16+
@RequestLine("GET /?Action=GetUser&Version=2010-05-08&limit=1")
17+
Response query();
18+
19+
@RequestLine("GET /domains/{domainId}/records?name={name}&type={type}")
20+
Response mixedParams(@Param("domainId") int id,
21+
@Param("name") String nameFilter,
22+
@Param("type") String typeFilter);
23+
24+
@RequestLine("PATCH /")
25+
Response customMethod();
26+
27+
@RequestLine("PUT /")
28+
@Headers("Content-Type: application/json")
29+
void bodyParam(List<String> body);
30+
31+
@RequestLine("POST /")
32+
@Body("%7B\"customer_name\": \"{customer_name}\", \"user_name\": \"{user_name}\", \"password\": \"{password}\"%7D")
33+
void form(@Param("customer_name") String customer, @Param("user_name") String user,
34+
@Param("password") String password);
35+
36+
@RequestLine("POST /")
37+
@Headers({"Happy: sad", "Auth-Token: {authToken}"})
38+
void headers(@HeaderParam("authToken") String token);
39+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package feign.benchmark;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
import java.util.List;
8+
9+
import javax.ws.rs.Consumes;
10+
import javax.ws.rs.FormParam;
11+
import javax.ws.rs.GET;
12+
import javax.ws.rs.HeaderParam;
13+
import javax.ws.rs.HttpMethod;
14+
import javax.ws.rs.POST;
15+
import javax.ws.rs.PUT;
16+
import javax.ws.rs.Path;
17+
import javax.ws.rs.PathParam;
18+
import javax.ws.rs.Produces;
19+
import javax.ws.rs.QueryParam;
20+
21+
import feign.Headers;
22+
import feign.Response;
23+
24+
@Consumes("application/json")
25+
interface JAXRSTestInterface {
26+
27+
@GET
28+
@Path("/?Action=GetUser&Version=2010-05-08&limit=1")
29+
Response query();
30+
31+
@GET
32+
@Path("/domains/{domainId}/records")
33+
Response mixedParams(@PathParam("domainId") int id, @QueryParam("name") String nameFilter,
34+
@QueryParam("type") String typeFilter);
35+
36+
@PATCH
37+
Response customMethod();
38+
39+
@Target({ElementType.METHOD})
40+
@Retention(RetentionPolicy.RUNTIME)
41+
@HttpMethod("PATCH")
42+
@interface PATCH {
43+
44+
}
45+
46+
@PUT
47+
@Produces("application/json")
48+
void bodyParam(List<String> body);
49+
50+
@POST
51+
void form(@FormParam("customer_name") String customer, @FormParam("user_name") String user,
52+
@FormParam("password") String password);
53+
54+
@POST
55+
@Headers("Happy: sad")
56+
void headers(@HeaderParam("Auth-Token") String token);
57+
}

0 commit comments

Comments
 (0)