Skip to content

Commit 94b1329

Browse files
committed
Setup JMH benchmarking
Signed-off-by: christian.lutnik <[email protected]>
1 parent 62738f7 commit 94b1329

File tree

5 files changed

+146
-1
lines changed

5 files changed

+146
-1
lines changed

.github/workflows/pullrequest.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,8 @@ jobs:
5454
fail_ci_if_error: true # optional (default = false)
5555
verbose: true # optional (default = false)
5656

57+
- name: Run JMH benchmark
58+
run: 'jmh:benchmark -rf json -rff output.json .*'
59+
5760
- name: Perform CodeQL Analysis
5861
uses: github/codeql-action/analyze@624d0bca90f761ffa7ce50c41875a1a226969a02

pom.xml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,12 @@
167167
<version>1.37</version>
168168
<scope>test</scope>
169169
</dependency>
170-
170+
<dependency>
171+
<groupId>org.openjdk.jmh</groupId>
172+
<artifactId>jmh-generator-annprocess</artifactId>
173+
<version>1.37</version>
174+
<scope>test</scope>
175+
</dependency>
171176
</dependencies>
172177

173178
<dependencyManagement>
@@ -703,6 +708,19 @@
703708
</execution>
704709
</executions>
705710
</plugin>
711+
<plugin>
712+
<artifactId>maven-compiler-plugin</artifactId>
713+
<version>3.8.1</version>
714+
<configuration>
715+
<annotationProcessorPaths>
716+
<path>
717+
<groupId>org.openjdk.jmh</groupId>
718+
<artifactId>jmh-generator-annprocess</artifactId>
719+
<version>1.37</version>
720+
</path>
721+
</annotationProcessorPaths>
722+
</configuration>
723+
</plugin>
706724
</plugins>
707725
</build>
708726
</profile>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package dev.openfeature.sdk;
2+
3+
import dev.openfeature.sdk.state.FlagEvaluationState;
4+
import java.util.concurrent.TimeUnit;
5+
import dev.openfeature.sdk.state.HooksState;
6+
import org.openjdk.jmh.annotations.Benchmark;
7+
import org.openjdk.jmh.annotations.BenchmarkMode;
8+
import org.openjdk.jmh.annotations.Fork;
9+
import org.openjdk.jmh.annotations.Measurement;
10+
import org.openjdk.jmh.annotations.Mode;
11+
import org.openjdk.jmh.annotations.Warmup;
12+
13+
14+
@BenchmarkMode(Mode.Throughput)
15+
@Warmup(time = 1, timeUnit = TimeUnit.SECONDS, iterations = 1)
16+
//@Warmup(time = 1, timeUnit = TimeUnit.SECONDS, iterations = 2)
17+
@Measurement(time = 5, timeUnit = TimeUnit.SECONDS, iterations = 1)
18+
//@Measurement(time = 5, timeUnit = TimeUnit.SECONDS, iterations = 4)
19+
@Fork(1)
20+
public class FlagEvaluationBenchmark {
21+
22+
@Benchmark
23+
public String flagEvaluations(FlagEvaluationState state) {
24+
return state.client.getStringDetails(FlagEvaluationState.FLAG_KEY, "default").getValue();
25+
}
26+
27+
@Benchmark
28+
public String hookExecution(HooksState state) {
29+
return state.client.getStringDetails(HooksState.FLAG_KEY, "default").getValue();
30+
}
31+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package dev.openfeature.sdk.state;
2+
3+
import dev.openfeature.sdk.Client;
4+
import dev.openfeature.sdk.ImmutableMetadata;
5+
import dev.openfeature.sdk.OpenFeatureAPI;
6+
import dev.openfeature.sdk.providers.memory.Flag;
7+
import dev.openfeature.sdk.providers.memory.InMemoryProvider;
8+
import org.openjdk.jmh.annotations.Level;
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.TearDown;
13+
import java.util.Map;
14+
15+
@State(Scope.Benchmark)
16+
public class FlagEvaluationState {
17+
public static final String FLAG_KEY = "flag-key";
18+
public static final String DOMAIN = "jmh-domain";
19+
20+
public InMemoryProvider provider;
21+
public Client client;
22+
23+
@Setup(Level.Trial)
24+
public void setup() {
25+
provider = new InMemoryProvider(
26+
Map.of(
27+
FLAG_KEY,
28+
Flag.builder()
29+
.variant("a", "a-value")
30+
.variant("b", "b-value")
31+
.defaultVariant("b")
32+
.flagMetadata(ImmutableMetadata.builder().addString("meta", "data").build())
33+
.build()
34+
)
35+
);
36+
OpenFeatureAPI.getInstance().setProviderAndWait(DOMAIN, provider);
37+
client = OpenFeatureAPI.getInstance().getClient(DOMAIN);
38+
}
39+
40+
@TearDown(Level.Trial)
41+
public void teardown() {
42+
OpenFeatureAPI.getInstance().shutdown();
43+
OpenFeatureAPI.getInstance().clearHooks();
44+
}
45+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package dev.openfeature.sdk.state;
2+
3+
import dev.openfeature.sdk.Client;
4+
import dev.openfeature.sdk.Hook;
5+
import dev.openfeature.sdk.ImmutableMetadata;
6+
import dev.openfeature.sdk.OpenFeatureAPI;
7+
import dev.openfeature.sdk.StringHook;
8+
import dev.openfeature.sdk.providers.memory.Flag;
9+
import dev.openfeature.sdk.providers.memory.InMemoryProvider;
10+
import java.util.Map;
11+
import org.openjdk.jmh.annotations.Level;
12+
import org.openjdk.jmh.annotations.Scope;
13+
import org.openjdk.jmh.annotations.Setup;
14+
import org.openjdk.jmh.annotations.State;
15+
import org.openjdk.jmh.annotations.TearDown;
16+
17+
@State(Scope.Benchmark)
18+
public class HooksState {
19+
public static final String FLAG_KEY = "flag-key";
20+
public static final String DOMAIN = "jmh-domain";
21+
22+
public InMemoryProvider provider;
23+
public Client client;
24+
25+
@Setup(Level.Trial)
26+
public void setup() {
27+
provider = new InMemoryProvider(
28+
Map.of(
29+
FLAG_KEY,
30+
Flag.builder()
31+
.variant("a", "a-value")
32+
.variant("b", "b-value")
33+
.defaultVariant("b")
34+
.flagMetadata(ImmutableMetadata.builder().addString("meta", "data").build())
35+
.build()
36+
)
37+
);
38+
OpenFeatureAPI.getInstance().setProviderAndWait(DOMAIN, provider);
39+
client = OpenFeatureAPI.getInstance().getClient(DOMAIN);
40+
client.addHooks(new StringHook() {}, new Hook() {});
41+
}
42+
43+
@TearDown(Level.Trial)
44+
public void teardown() {
45+
OpenFeatureAPI.getInstance().shutdown();
46+
OpenFeatureAPI.getInstance().clearHooks();
47+
}
48+
}

0 commit comments

Comments
 (0)