diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index a226a540..9f7f9deb 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -16,7 +16,7 @@ jobs: steps: - uses: actions/checkout@v5 - - uses: gradle/actions/wrapper-validation@v6.2.0 + - uses: gradle/actions/wrapper-validation@v6.4.0 - name: Set up JDK 21 uses: actions/setup-java@v5 with: @@ -26,7 +26,7 @@ jobs: # Configure Gradle for optimal use in GiHub Actions, including caching of downloaded dependencies. # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6.2.0 + uses: gradle/actions/setup-gradle@v6.4.0 - name: build test and publish run: ./gradlew assemble && ./gradlew check --info && ./gradlew jcstress && ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository -x check --info --stacktrace env: diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 790a8dc9..a9f4563c 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - - uses: gradle/actions/wrapper-validation@v6.2.0 + - uses: gradle/actions/wrapper-validation@v6.4.0 - name: Set up JDK 21 uses: actions/setup-java@v5 with: @@ -24,7 +24,7 @@ jobs: # Configure Gradle for optimal use in GiHub Actions, including caching of downloaded dependencies. # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6.2.0 + uses: gradle/actions/setup-gradle@v6.4.0 - name: build and test run: ./gradlew assemble && ./gradlew check --info --stacktrace && ./gradlew jcstress env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e45c7241..6b82e779 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v5 - - uses: gradle/actions/wrapper-validation@v6.2.0 + - uses: gradle/actions/wrapper-validation@v6.4.0 - name: Set up JDK 21 uses: actions/setup-java@v5 with: @@ -30,7 +30,7 @@ jobs: # Configure Gradle for optimal use in GiHub Actions, including caching of downloaded dependencies. # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6.2.0 + uses: gradle/actions/setup-gradle@v6.4.0 - name: build test and publish run: ./gradlew assemble && ./gradlew check --info && ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository -x check --info --stacktrace env: diff --git a/src/jmh/java/performance/ScheduledDataLoaderRegistryDispatchPerformance.java b/src/jmh/java/performance/ScheduledDataLoaderRegistryDispatchPerformance.java new file mode 100644 index 00000000..a1a0a3bf --- /dev/null +++ b/src/jmh/java/performance/ScheduledDataLoaderRegistryDispatchPerformance.java @@ -0,0 +1,91 @@ +package performance; + +import org.dataloader.BatchLoader; +import org.dataloader.DataLoader; +import org.dataloader.DataLoaderFactory; +import org.dataloader.DataLoaderOptions; +import org.dataloader.registries.DispatchPredicate; +import org.dataloader.registries.ScheduledDataLoaderRegistry; +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.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * A ticker-mode {@link ScheduledDataLoaderRegistry} set up the way a GraphQL server builds one per request: every + * data loader the application defines is registered, but a request only queues keys on a few of them, while + * graphql-java's per-level dispatch calls {@link ScheduledDataLoaderRegistry#dispatchAll()} many times. + *
+ * The tick is an hour so that the scheduled ticker never runs during a measurement.
+ */
+@State(Scope.Benchmark)
+@Warmup(iterations = 3, time = 2)
+@Measurement(iterations = 5, time = 2)
+@Fork(2)
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+public class ScheduledDataLoaderRegistryDispatchPerformance {
+
+ @Param({"20", "200"})
+ int registeredLoaders;
+
+ @Param({"0", "5"})
+ int loadersWithQueuedKeys;
+
+ ScheduledThreadPoolExecutor executor;
+ ScheduledDataLoaderRegistry registry;
+ List