Skip to content

Commit 44f9ab1

Browse files
authored
Add a 'large list' benchmark, also bump benchmark dependency (#6432)
1 parent 0c075c8 commit 44f9ab1

File tree

10 files changed

+40088
-18
lines changed

10 files changed

+40088
-18
lines changed

benchmark/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ For the command line, use:
2121

2222
The `largesample` Json parsing data is taken from https://zacsweers.github.io/json-serialization-benchmarking/.
2323
The `calendar_response` data was provided by @sebj and is a real-life use case.
24+
The `tracks` data is inspired by the Deezer API.
2425

2526
## Current results:
2627

benchmark/microbenchmark/build.gradle.kts

+4
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,8 @@ configure<com.apollographql.apollo.gradle.api.ApolloExtension> {
7474
argument("packageName", packageName.get())
7575
}
7676
}
77+
service("tracks") {
78+
srcDir("src/main/graphql/tracks")
79+
packageName.set("com.apollographql.apollo.tracks")
80+
}
7781
}

benchmark/microbenchmark/src/androidTest/java/com/apollographql/apollo/benchmark/CacheIncubatingTests.kt

+17-6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.apollographql.apollo.api.json.jsonReader
77
import com.apollographql.apollo.api.parseJsonResponse
88
import com.apollographql.apollo.benchmark.Utils.dbFile
99
import com.apollographql.apollo.benchmark.Utils.dbName
10+
import com.apollographql.apollo.benchmark.Utils.largeListQuery
1011
import com.apollographql.apollo.benchmark.Utils.operationBasedQuery
1112
import com.apollographql.apollo.benchmark.Utils.registerCacheSize
1213
import com.apollographql.apollo.benchmark.Utils.resource
@@ -25,25 +26,35 @@ class CacheIncubatingTests {
2526

2627
@Test
2728
fun cacheOperationMemory() {
28-
readFromCache("cacheOperationMemory", operationBasedQuery, sql = false, Utils::checkOperationBased)
29+
readFromCache("cacheOperationMemory", operationBasedQuery, R.raw.calendar_response, sql = false, Utils::checkOperationBased)
2930
}
3031

3132
@Test
3233
fun cacheOperationSql() {
33-
readFromCache("cacheOperationSql", operationBasedQuery, sql = true, Utils::checkOperationBased)
34+
readFromCache("cacheOperationSql", operationBasedQuery, R.raw.calendar_response, sql = true, Utils::checkOperationBased)
3435
}
3536

3637
@Test
3738
fun cacheResponseMemory() {
38-
readFromCache("cacheResponseMemory", responseBasedQuery, sql = false, Utils::checkResponseBased)
39+
readFromCache("cacheResponseMemory", responseBasedQuery, R.raw.calendar_response, sql = false, Utils::checkResponseBased)
3940
}
4041

4142
@Test
4243
fun cacheResponseSql() {
43-
readFromCache("cacheResponseSql", responseBasedQuery, sql = true, Utils::checkResponseBased)
44+
readFromCache("cacheResponseSql", responseBasedQuery, R.raw.calendar_response, sql = true, Utils::checkResponseBased)
4445
}
4546

46-
private fun <D : Query.Data> readFromCache(testName: String, query: Query<D>, sql: Boolean, check: (D) -> Unit) {
47+
@Test
48+
fun cacheLargeListMemory() {
49+
readFromCache("cacheLargeListMemory", largeListQuery, R.raw.tracks_playlist_response, sql = false, Utils::checkLargeList)
50+
}
51+
52+
@Test
53+
fun cacheLargeListSql() {
54+
readFromCache("cacheLargeListSql", largeListQuery, R.raw.tracks_playlist_response, sql = true, Utils::checkLargeList)
55+
}
56+
57+
private fun <D : Query.Data> readFromCache(testName: String, query: Query<D>, jsonResponseResId: Int, sql: Boolean, check: (D) -> Unit) {
4758
val store = ApolloStore(
4859
if (sql) {
4960
dbFile.delete()
@@ -53,7 +64,7 @@ class CacheIncubatingTests {
5364
}
5465
)
5566

56-
val data = query.parseJsonResponse(resource(R.raw.calendar_response).jsonReader()).data!!
67+
val data = query.parseJsonResponse(resource(jsonResponseResId).jsonReader()).data!!
5768
runBlocking {
5869
store.writeOperation(query, data)
5970
}

benchmark/microbenchmark/src/androidTest/java/com/apollographql/apollo/benchmark/CacheTests.kt

+17-6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.apollographql.apollo.api.json.jsonReader
77
import com.apollographql.apollo.api.parseJsonResponse
88
import com.apollographql.apollo.benchmark.Utils.dbFile
99
import com.apollographql.apollo.benchmark.Utils.dbName
10+
import com.apollographql.apollo.benchmark.Utils.largeListQuery
1011
import com.apollographql.apollo.benchmark.Utils.operationBasedQuery
1112
import com.apollographql.apollo.benchmark.Utils.registerCacheSize
1213
import com.apollographql.apollo.benchmark.Utils.resource
@@ -25,25 +26,35 @@ class CacheTests {
2526

2627
@Test
2728
fun cacheOperationMemory() {
28-
readFromCache("cacheOperationMemory", operationBasedQuery, sql = false, Utils::checkOperationBased)
29+
readFromCache("cacheOperationMemory", operationBasedQuery, R.raw.calendar_response, sql = false, Utils::checkOperationBased)
2930
}
3031

3132
@Test
3233
fun cacheOperationSql() {
33-
readFromCache("cacheOperationSql", operationBasedQuery, sql = true, Utils::checkOperationBased)
34+
readFromCache("cacheOperationSql", operationBasedQuery, R.raw.calendar_response, sql = true, Utils::checkOperationBased)
3435
}
3536

3637
@Test
3738
fun cacheResponseMemory() {
38-
readFromCache("cacheResponseMemory", responseBasedQuery, sql = false, Utils::checkResponseBased)
39+
readFromCache("cacheResponseMemory", responseBasedQuery, R.raw.calendar_response, sql = false, Utils::checkResponseBased)
3940
}
4041

4142
@Test
4243
fun cacheResponseSql() {
43-
readFromCache("cacheResponseSql", responseBasedQuery, sql = true, Utils::checkResponseBased)
44+
readFromCache("cacheResponseSql", responseBasedQuery, R.raw.calendar_response, sql = true, Utils::checkResponseBased)
4445
}
4546

46-
private fun <D : Query.Data> readFromCache(testName: String, query: Query<D>, sql: Boolean, check: (D) -> Unit) {
47+
@Test
48+
fun cacheLargeListMemory() {
49+
readFromCache("cacheLargeListMemory", largeListQuery, R.raw.tracks_playlist_response, sql = false, Utils::checkLargeList)
50+
}
51+
52+
@Test
53+
fun cacheLargeListSql() {
54+
readFromCache("cacheLargeListSql", largeListQuery, R.raw.tracks_playlist_response, sql = true, Utils::checkLargeList)
55+
}
56+
57+
private fun <D : Query.Data> readFromCache(testName: String, query: Query<D>, jsonResponseResId: Int, sql: Boolean, check: (D) -> Unit) {
4758
val store = ApolloStore(
4859
if (sql) {
4960
dbFile.delete()
@@ -53,7 +64,7 @@ class CacheTests {
5364
}
5465
)
5566

56-
val data = query.parseJsonResponse(resource(R.raw.calendar_response).jsonReader()).data!!
67+
val data = query.parseJsonResponse(resource(jsonResponseResId).jsonReader()).data!!
5768
runBlocking {
5869
store.writeOperation(query, data)
5970
}

benchmark/microbenchmark/src/androidTest/java/com/apollographql/apollo/benchmark/Utils.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.apollographql.apollo.calendar.operation.ItemsQuery
99
import com.apollographql.apollo.calendar.response.ItemsQuery.Data.Items.Edge.Node.Companion.itemFragment
1010
import com.apollographql.apollo.calendar.response.fragment.CalendarFragment.Provider.Node.Companion.calendarProviderFragment
1111
import com.apollographql.apollo.calendar.response.fragment.ItemFragment.Calendar.Node.Companion.calendarFragment
12+
import com.apollographql.apollo.tracks.PlaylistRawTracksQuery
1213
import okio.Buffer
1314
import okio.BufferedSource
1415
import okio.source
@@ -21,6 +22,7 @@ object Utils {
2122
val dbFile: File = InstrumentationRegistry.getInstrumentation().context.getDatabasePath(dbName)
2223
val responseBasedQuery = com.apollographql.apollo.calendar.response.ItemsQuery(endingAfter = "", startingBefore = "")
2324
val operationBasedQuery = ItemsQuery(endingAfter = "", startingBefore = "")
25+
val largeListQuery = PlaylistRawTracksQuery("42")
2426

2527
/**
2628
* Reads a resource into a fully buffered [BufferedSource]. This function returns a peeked [BufferedSource]
@@ -52,7 +54,7 @@ object Utils {
5254
)
5355
)
5456
)
55-
Outputs.writeFile("extraMetrics.json", "extraMetrics", true) {
57+
Outputs.writeFile("extraMetrics.json", true) {
5658
it.writeText(
5759
buildJsonString {
5860
AnyAdapter.toJson(this, CustomScalarAdapters.Empty, extraMetrics)
@@ -69,4 +71,7 @@ object Utils {
6971
check(data.items!!.edges[248].node.itemFragment()!!.calendar!!.node.calendarFragment()!!.provider.node.calendarProviderFragment()!!.id == "cc8e4c28-f178-11ec-8ea0-0242ac120002")
7072
}
7173

74+
internal fun checkLargeList(data: PlaylistRawTracksQuery.Data) {
75+
check(data.playlist!!.rawTracks.size == 10000 && data.playlist.rawTracks[9999]!!.trackId == "142429999")
76+
}
7277
}

0 commit comments

Comments
 (0)