bad performance and high memory usage when returning large array of nested objects
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
