-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
This is basically a clone of an issue smallrye/smallrye-graphql#930 which I originally opened in SmallRye GraphQL, but it was suspected to be only relevant to graphql-java.
I encountered a performance issue when returning a large array of nested objects as response to a GraphQL query and was wondering whether it would be considered an actual performance issue or out of scope. Here is a minimal test class to illustrate the issue, using graphql-java 17.3 with java 17:
class GraphQLPerformanceTest {
private static final List<SomeWrapper> objects = IntStream
.range(0, 10_000_000)
.mapToObj(i -> new SomeWrapper("value #" + i))
.collect(Collectors.toList());
@Value
public static class SomeWrapper {
String someValue;
}
private final GraphQL graphQL;
public GraphQLPerformanceTest() {
TypeDefinitionRegistry typeDefinitionRegistry = new SchemaParser().parse(
"""
type Query {
giveMeLargeResponse: [SomeWrapper]
}
type SomeWrapper {
someValue: String
}
"""
);
RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring()
.type(newTypeWiring("Query")
.dataFetcher("giveMeLargeResponse", env -> objects))
.build();
GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(typeDefinitionRegistry, wiring);
this.graphQL = GraphQL.newGraphQL(schema).build();
}
@Test
void testPerformance() {
graphQL.execute(
"""
query {
giveMeLargeResponse {
someValue
}
}
"""
);
}
}
The request takes roughly 12s to return on my Dell precision 7560 notebook with an Intel(R) Core(TM) i9-11950H CPU @ 2.60GHz and intermittedly takes up over 4GB of RAM.
I know 10 million entries is a lot, but I expected the query to return much faster, given that it only needs to serialize and output the data. The majority of the time seems to be spent within completeValueForList:
The flame graph in IntelliJ looks something like this, so I couldn't see any obvious low hanging fruit:
I attached the intellij profiling data and the visualvm snapshot data:
GraphQLPerformanceTest_testPerformance_2021_11_04_111402.zip
graphql-java-performance-snapshot.zip