Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 160 additions & 0 deletions src/jmh/java/benchmark/SubscriptionValidationBenchmark.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
package benchmark;

import graphql.language.Document;
import graphql.parser.Parser;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.SchemaGenerator;
import graphql.validation.ValidationError;
import graphql.validation.Validator;
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.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

import static graphql.Assert.assertTrue;

@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 2, time = 5)
@Measurement(iterations = 3)
@Fork(2)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class SubscriptionValidationBenchmark {

private GraphQLSchema schema;
private Document complexSubscriptionDocument;

@Setup
public void setup() {
schema = SchemaGenerator.createdMockedSchema(schemaSdl());
complexSubscriptionDocument = Parser.parse(complexSubscriptionQuery());
assertTrue(validate(complexSubscriptionDocument).isEmpty());
}

@Benchmark
public List<ValidationError> complexSubscription() {
return validate(complexSubscriptionDocument);
}

private List<ValidationError> validate(Document document) {
Validator validator = new Validator();
return validator.validateDocument(schema, document, Locale.ENGLISH);
}

private static String schemaSdl() {
return String.join("\n",
"schema {",
" query: Query",
" subscription: Subscription",
"}",
"",
"type Query {",
" event: Event",
"}",
"",
"type Subscription {",
" event: Event",
"}",
"",
"interface Node {",
" id: ID",
"}",
"",
"interface Named {",
" name: String",
"}",
"",
"type Event implements Node & Named {",
" id: ID",
" name: String",
" timestamp: String",
" payload: Payload",
" related: Event",
"}",
"",
"type Payload {",
" id: ID",
" value: String",
" nested: Payload",
" metrics: Metrics",
"}",
"",
"type Metrics {",
" count: Int",
" label: String",
"}");
}

private static String complexSubscriptionQuery() {
StringBuilder query = new StringBuilder();
query.append("subscription ComplexSubscription {\n");
appendRootFragmentSpreads(query);
query.append("}\n");
appendRootFragments(query);
appendEventFragments(query);
appendSharedEventFragment(query);
return query.toString();
}

private static void appendRootFragmentSpreads(StringBuilder query) {
for (int i = 0; i < 50; i++) {
query.append(" ...RootFragment").append(i).append("\n");
}
}

private static void appendRootFragments(StringBuilder query) {
for (int i = 0; i < 50; i++) {
query.append("fragment RootFragment").append(i).append(" on Subscription {\n");
query.append(" event {\n");
query.append(" ...EventFragment").append(i % 20).append("\n");
query.append(" ...SharedEventFields\n");
query.append(" related {\n");
query.append(" ...SharedEventFields\n");
query.append(" }\n");
query.append(" }\n");
query.append("}\n");
}
}

private static void appendEventFragments(StringBuilder query) {
for (int i = 0; i < 20; i++) {
query.append("fragment EventFragment").append(i).append(" on Event {\n");
query.append(" id\n");
query.append(" name\n");
query.append(" payload {\n");
query.append(" value\n");
query.append(" metrics {\n");
query.append(" count\n");
query.append(" label\n");
query.append(" }\n");
query.append(" }\n");
query.append("}\n");
}
}

private static void appendSharedEventFragment(StringBuilder query) {
query.append("fragment SharedEventFields on Event {\n");
query.append(" id\n");
query.append(" name\n");
query.append(" timestamp\n");
query.append(" payload {\n");
query.append(" nested {\n");
query.append(" value\n");
query.append(" metrics {\n");
query.append(" count\n");
query.append(" }\n");
query.append(" }\n");
query.append(" }\n");
query.append("}\n");
}
}
28 changes: 10 additions & 18 deletions src/jmh/java/benchmark/ValidatorBenchmark.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package benchmark;

import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.language.Document;
import graphql.parser.Parser;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.SchemaGenerator;
import graphql.validation.ValidationError;
import graphql.validation.Validator;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
Expand All @@ -18,12 +17,10 @@
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;

import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

import static graphql.Assert.assertTrue;


@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 2, time = 5)
Expand Down Expand Up @@ -61,11 +58,6 @@ private Scenario load(String schemaPath, String queryPath) {
String query = BenchmarkUtils.loadResource(queryPath);
GraphQLSchema schema = SchemaGenerator.createdMockedSchema(schemaString);
Document document = Parser.parse(query);

// make sure this is a valid query overall
GraphQL graphQL = GraphQL.newGraphQL(schema).build();
ExecutionResult executionResult = graphQL.execute(query);
assertTrue(executionResult.getErrors().size() == 0);
return new Scenario(schema, document);
} catch (Exception e) {
throw new RuntimeException(e);
Expand All @@ -74,23 +66,23 @@ private Scenario load(String schemaPath, String queryPath) {

}

private void run(Scenario scenario) {
private List<ValidationError> run(Scenario scenario) {
Validator validator = new Validator();
validator.validateDocument(scenario.schema, scenario.document, Locale.ENGLISH);
return validator.validateDocument(scenario.schema, scenario.document, Locale.ENGLISH);
}

@Benchmark
public void largeSchema1(MyState state) {
run(state.largeSchema1);
public List<ValidationError> largeSchema1(MyState state) {
return run(state.largeSchema1);
}

@Benchmark
public void largeSchema4(MyState state) {
run(state.largeSchema4);
public List<ValidationError> largeSchema4(MyState state) {
return run(state.largeSchema4);
}

@Benchmark
public void manyFragments(MyState state) {
run(state.manyFragments);
public List<ValidationError> manyFragments(MyState state) {
return run(state.manyFragments);
}
}
Loading