diff --git a/performance-results/2025-04-07T01:27:42Z-154bb89d14e9701d1b9f0764cbf813ba3a3c050a-jdk17.json b/performance-results/2025-04-07T01:27:42Z-154bb89d14e9701d1b9f0764cbf813ba3a3c050a-jdk17.json index fb66c07511..1a46afd5c6 100644 --- a/performance-results/2025-04-07T01:27:42Z-154bb89d14e9701d1b9f0764cbf813ba3a3c050a-jdk17.json +++ b/performance-results/2025-04-07T01:27:42Z-154bb89d14e9701d1b9f0764cbf813ba3a3c050a-jdk17.json @@ -1,1310 +1,1310 @@ [ - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + { + "jmhVersion": "1.37", + "benchmark": "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 2, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "howManyItems": "5" + }, + "primaryMetric": { + "score": 3.4102846934427835, + "scoreError": 0.029120215772332664, + "scoreConfidence": [ + 3.381164477670451, + 3.439404909215116 + ], + "scorePercentiles": { + "0.0": 3.40421431924695, + "50.0": 3.411477217299319, + "90.0": 3.4139700199255474, + "95.0": 3.4139700199255474, + "99.0": 3.4139700199255474, + "99.9": 3.4139700199255474, + "99.99": 3.4139700199255474, + "99.999": 3.4139700199255474, + "99.9999": 3.4139700199255474, + "100.0": 3.4139700199255474 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 3.40421431924695, + 3.4139700199255474 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 2, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "howManyItems" : "5" - }, - "primaryMetric" : { - "score" : 3.4102846934427835, - "scoreError" : 0.029120215772332664, - "scoreConfidence" : [ - 3.381164477670451, - 3.439404909215116 - ], - "scorePercentiles" : { - "0.0" : 3.40421431924695, - "50.0" : 3.411477217299319, - "90.0" : 3.4139700199255474, - "95.0" : 3.4139700199255474, - "99.0" : 3.4139700199255474, - "99.9" : 3.4139700199255474, - "99.99" : 3.4139700199255474, - "99.999" : 3.4139700199255474, - "99.9999" : 3.4139700199255474, - "100.0" : 3.4139700199255474 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 3.40421431924695, - 3.4139700199255474 - ], - [ - 3.4095218102136196, - 3.4134326243850186 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 3.4095218102136196, + 3.4134326243850186 + ] + ] + }, + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 2, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "howManyItems": "10" }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "primaryMetric": { + "score": 1.7221652033520922, + "scoreError": 0.009478621744532833, + "scoreConfidence": [ + 1.7126865816075594, + 1.731643825096625 + ], + "scorePercentiles": { + "0.0": 1.7203619756019852, + "50.0": 1.722271370931328, + "90.0": 1.723756095943728, + "95.0": 1.723756095943728, + "99.0": 1.723756095943728, + "99.9": 1.723756095943728, + "99.99": 1.723756095943728, + "99.999": 1.723756095943728, + "99.9999": 1.723756095943728, + "100.0": 1.723756095943728 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 1.7228412979004932, + 1.723756095943728 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 2, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "howManyItems" : "10" - }, - "primaryMetric" : { - "score" : 1.7221652033520922, - "scoreError" : 0.009478621744532833, - "scoreConfidence" : [ - 1.7126865816075594, - 1.731643825096625 - ], - "scorePercentiles" : { - "0.0" : 1.7203619756019852, - "50.0" : 1.722271370931328, - "90.0" : 1.723756095943728, - "95.0" : 1.723756095943728, - "99.0" : 1.723756095943728, - "99.9" : 1.723756095943728, - "99.99" : 1.723756095943728, - "99.999" : 1.723756095943728, - "99.9999" : 1.723756095943728, - "100.0" : 1.723756095943728 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 1.7228412979004932, - 1.723756095943728 - ], - [ - 1.7203619756019852, - 1.7217014439621625 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 1.7203619756019852, + 1.7217014439621625 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 2, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "howManyItems": "20" + }, + "primaryMetric": { + "score": 0.8638167830583094, + "scoreError": 0.005432486996052623, + "scoreConfidence": [ + 0.8583842960622569, + 0.869249270054362 + ], + "scorePercentiles": { + "0.0": 0.8627272504566224, + "50.0": 0.8639140939295744, + "90.0": 0.8647116939174667, + "95.0": 0.8647116939174667, + "99.0": 0.8647116939174667, + "99.9": 0.8647116939174667, + "99.99": 0.8647116939174667, + "99.999": 0.8647116939174667, + "99.9999": 0.8647116939174667, + "100.0": 0.8647116939174667 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 0.8627272504566224, + 0.8647116939174667 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 2, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "howManyItems" : "20" - }, - "primaryMetric" : { - "score" : 0.8638167830583094, - "scoreError" : 0.005432486996052623, - "scoreConfidence" : [ - 0.8583842960622569, - 0.869249270054362 - ], - "scorePercentiles" : { - "0.0" : 0.8627272504566224, - "50.0" : 0.8639140939295744, - "90.0" : 0.8647116939174667, - "95.0" : 0.8647116939174667, - "99.0" : 0.8647116939174667, - "99.9" : 0.8647116939174667, - "99.99" : 0.8647116939174667, - "99.999" : 0.8647116939174667, - "99.9999" : 0.8647116939174667, - "100.0" : 0.8647116939174667 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 0.8627272504566224, - 0.8647116939174667 - ], - [ - 0.8641521696201839, - 0.863676018238965 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.8641521696201839, + 0.863676018238965 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.DFSelectionSetPerformance.benchMarkThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.DFSelectionSetPerformance.benchMarkThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 15.856427557514358, + "scoreError": 0.21807549856382044, + "scoreConfidence": [ + 15.638352058950538, + 16.07450305607818 + ], + "scorePercentiles": { + "0.0": 15.681327891325898, + "50.0": 15.904269221101467, + "90.0": 16.02142911448296, + "95.0": 16.02142911448296, + "99.0": 16.02142911448296, + "99.9": 16.02142911448296, + "99.99": 16.02142911448296, + "99.999": 16.02142911448296, + "99.9999": 16.02142911448296, + "100.0": 16.02142911448296 + }, + "scoreUnit": "ops/ms", + "rawData": [ + [ + 15.904269221101467, + 16.02142911448296, + 15.943726644806675 + ], + [ + 15.681327891325898, + 15.700241982223265, + 15.6913767022947 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 15.856427557514358, - "scoreError" : 0.21807549856382044, - "scoreConfidence" : [ - 15.638352058950538, - 16.07450305607818 - ], - "scorePercentiles" : { - "0.0" : 15.681327891325898, - "50.0" : 15.904269221101467, - "90.0" : 16.02142911448296, - "95.0" : 16.02142911448296, - "99.0" : 16.02142911448296, - "99.9" : 16.02142911448296, - "99.99" : 16.02142911448296, - "99.999" : 16.02142911448296, - "99.9999" : 16.02142911448296, - "100.0" : 16.02142911448296 - }, - "scoreUnit" : "ops/ms", - "rawData" : [ - [ - 15.904269221101467, - 16.02142911448296, - 15.943726644806675 - ], - [ - 15.681327891325898, - 15.700241982223265, - 15.6913767022947 - ], - [ - 15.881763309316872, - 15.936401461123317, - 15.947311690954091 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 15.881763309316872, + 15.936401461123317, + 15.947311690954091 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.DFSelectionSetPerformance.benchMarkThroughput_getImmediateFields", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.DFSelectionSetPerformance.benchMarkThroughput_getImmediateFields", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 2615.3268175518824, + "scoreError": 85.27331964422102, + "scoreConfidence": [ + 2530.0534979076615, + 2700.6001371961033 + ], + "scorePercentiles": { + "0.0": 2550.521812924825, + "50.0": 2603.3546349283893, + "90.0": 2682.250838153494, + "95.0": 2682.250838153494, + "99.0": 2682.250838153494, + "99.9": 2682.250838153494, + "99.99": 2682.250838153494, + "99.999": 2682.250838153494, + "99.9999": 2682.250838153494, + "100.0": 2682.250838153494 + }, + "scoreUnit": "ops/ms", + "rawData": [ + [ + 2682.250838153494, + 2674.2071330474264, + 2676.491646172537 + ], + [ + 2573.055142655825, + 2564.6397919711726, + 2550.521812924825 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 2615.3268175518824, - "scoreError" : 85.27331964422102, - "scoreConfidence" : [ - 2530.0534979076615, - 2700.6001371961033 - ], - "scorePercentiles" : { - "0.0" : 2550.521812924825, - "50.0" : 2603.3546349283893, - "90.0" : 2682.250838153494, - "95.0" : 2682.250838153494, - "99.0" : 2682.250838153494, - "99.9" : 2682.250838153494, - "99.99" : 2682.250838153494, - "99.999" : 2682.250838153494, - "99.9999" : 2682.250838153494, - "100.0" : 2682.250838153494 - }, - "scoreUnit" : "ops/ms", - "rawData" : [ - [ - 2682.250838153494, - 2674.2071330474264, - 2676.491646172537 - ], - [ - 2573.055142655825, - 2564.6397919711726, - 2550.521812924825 - ], - [ - 2612.447308343581, - 2603.3546349283893, - 2600.9730497696914 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 2612.447308343581, + 2603.3546349283893, + 2600.9730497696914 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENF1Performance.benchMarkThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENF1Performance.benchMarkThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 68682.74721165966, + "scoreError": 1904.0986389262905, + "scoreConfidence": [ + 66778.64857273338, + 70586.84585058595 + ], + "scorePercentiles": { + "0.0": 67315.78978042262, + "50.0": 68558.57912756453, + "90.0": 70108.49357429743, + "95.0": 70108.49357429743, + "99.0": 70108.49357429743, + "99.9": 70108.49357429743, + "99.99": 70108.49357429743, + "99.999": 70108.49357429743, + "99.9999": 70108.49357429743, + "100.0": 70108.49357429743 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 70081.54631565987, + 69908.33092759324, + 70108.49357429743 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 68682.74721165966, - "scoreError" : 1904.0986389262905, - "scoreConfidence" : [ - 66778.64857273338, - 70586.84585058595 - ], - "scorePercentiles" : { - "0.0" : 67315.78978042262, - "50.0" : 68558.57912756453, - "90.0" : 70108.49357429743, - "95.0" : 70108.49357429743, - "99.0" : 70108.49357429743, - "99.9" : 70108.49357429743, - "99.99" : 70108.49357429743, - "99.999" : 70108.49357429743, - "99.9999" : 70108.49357429743, - "100.0" : 70108.49357429743 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 70081.54631565987, - 69908.33092759324, - 70108.49357429743 - ], - [ - 68695.19237810129, - 68558.57912756453, - 68502.6084660597 - ], - [ - 67315.78978042262, - 67441.95616624445, - 67532.22816899384 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 68695.19237810129, + 68558.57912756453, + 68502.6084660597 + ], + [ + 67315.78978042262, + 67441.95616624445, + 67532.22816899384 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENFExtraLargePerformance.benchMarkThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENFExtraLargePerformance.benchMarkThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 341.9660588620118, + "scoreError": 5.428672335615734, + "scoreConfidence": [ + 336.53738652639606, + 347.3947311976275 + ], + "scorePercentiles": { + "0.0": 336.4476621680284, + "50.0": 342.2783710532269, + "90.0": 345.6060043253826, + "95.0": 345.6060043253826, + "99.0": 345.6060043253826, + "99.9": 345.6060043253826, + "99.99": 345.6060043253826, + "99.999": 345.6060043253826, + "99.9999": 345.6060043253826, + "100.0": 345.6060043253826 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 344.6308661866658, + 342.2263703728633, + 339.18226799196634 + ], + [ + 343.869334695566, + 344.96989920298415, + 345.6060043253826 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 341.9660588620118, - "scoreError" : 5.428672335615734, - "scoreConfidence" : [ - 336.53738652639606, - 347.3947311976275 - ], - "scorePercentiles" : { - "0.0" : 336.4476621680284, - "50.0" : 342.2783710532269, - "90.0" : 345.6060043253826, - "95.0" : 345.6060043253826, - "99.0" : 345.6060043253826, - "99.9" : 345.6060043253826, - "99.99" : 345.6060043253826, - "99.999" : 345.6060043253826, - "99.9999" : 345.6060043253826, - "100.0" : 345.6060043253826 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 344.6308661866658, - 342.2263703728633, - 339.18226799196634 - ], - [ - 343.869334695566, - 344.96989920298415, - 345.6060043253826 - ], - [ - 342.2783710532269, - 336.4476621680284, - 338.48375376142235 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 342.2783710532269, + 336.4476621680284, + 338.48375376142235 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.overlappingFieldValidationThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.overlappingFieldValidationThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 102.86025606846653, + "scoreError": 1.38084080828978, + "scoreConfidence": [ + 101.47941526017675, + 104.2410968767563 + ], + "scorePercentiles": { + "0.0": 101.80541629343892, + "50.0": 102.80111987931467, + "90.0": 104.77421204891745, + "95.0": 104.77421204891745, + "99.0": 104.77421204891745, + "99.9": 104.77421204891745, + "99.99": 104.77421204891745, + "99.999": 104.77421204891745, + "99.9999": 104.77421204891745, + "100.0": 104.77421204891745 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 102.3242423337249, + 101.80541629343892, + 102.80111987931467 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 102.86025606846653, - "scoreError" : 1.38084080828978, - "scoreConfidence" : [ - 101.47941526017675, - 104.2410968767563 - ], - "scorePercentiles" : { - "0.0" : 101.80541629343892, - "50.0" : 102.80111987931467, - "90.0" : 104.77421204891745, - "95.0" : 104.77421204891745, - "99.0" : 104.77421204891745, - "99.9" : 104.77421204891745, - "99.99" : 104.77421204891745, - "99.999" : 104.77421204891745, - "99.9999" : 104.77421204891745, - "100.0" : 104.77421204891745 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 102.3242423337249, - 101.80541629343892, - 102.80111987931467 - ], - [ - 104.77421204891745, - 102.62377671322751, - 102.42665569290861 - ], - [ - 102.93712545820337, - 102.90042617995776, - 103.14933001650559 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 104.77421204891745, + 102.62377671322751, + 102.42665569290861 + ], + [ + 102.93712545820337, + 102.90042617995776, + 103.14933001650559 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.DFSelectionSetPerformance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.DFSelectionSetPerformance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 0.06299738431052335, + "scoreError": 3.244688347044825E-4, + "scoreConfidence": [ + 0.06267291547581887, + 0.06332185314522783 + ], + "scorePercentiles": { + "0.0": 0.06275631095268876, + "50.0": 0.06303528535589117, + "90.0": 0.06329175614711299, + "95.0": 0.06329175614711299, + "99.0": 0.06329175614711299, + "99.9": 0.06329175614711299, + "99.99": 0.06329175614711299, + "99.999": 0.06329175614711299, + "99.9999": 0.06329175614711299, + "100.0": 0.06329175614711299 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.06309860325332525, + 0.06324095105863604, + 0.06305016569991047 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 0.06299738431052335, - "scoreError" : 3.244688347044825E-4, - "scoreConfidence" : [ - 0.06267291547581887, - 0.06332185314522783 - ], - "scorePercentiles" : { - "0.0" : 0.06275631095268876, - "50.0" : 0.06303528535589117, - "90.0" : 0.06329175614711299, - "95.0" : 0.06329175614711299, - "99.0" : 0.06329175614711299, - "99.9" : 0.06329175614711299, - "99.99" : 0.06329175614711299, - "99.999" : 0.06329175614711299, - "99.9999" : 0.06329175614711299, - "100.0" : 0.06329175614711299 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.06309860325332525, - 0.06324095105863604, - 0.06305016569991047 - ], - [ - 0.06283930007917657, - 0.06329175614711299, - 0.06303528535589117 - ], - [ - 0.0628358286427014, - 0.06275631095268876, - 0.06282825760526746 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.06283930007917657, + 0.06329175614711299, + 0.06303528535589117 + ], + [ + 0.0628358286427014, + 0.06275631095268876, + 0.06282825760526746 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.DFSelectionSetPerformance.benchMarkAvgTime_getImmediateFields", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.DFSelectionSetPerformance.benchMarkAvgTime_getImmediateFields", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 3.733489768801373E-4, + "scoreError": 7.710948014590726E-6, + "scoreConfidence": [ + 3.6563802886554656E-4, + 3.81059924894728E-4 + ], + "scorePercentiles": { + "0.0": 3.682361400802075E-4, + "50.0": 3.729608204948727E-4, + "90.0": 3.8100045308045563E-4, + "95.0": 3.8100045308045563E-4, + "99.0": 3.8100045308045563E-4, + "99.9": 3.8100045308045563E-4, + "99.99": 3.8100045308045563E-4, + "99.999": 3.8100045308045563E-4, + "99.9999": 3.8100045308045563E-4, + "100.0": 3.8100045308045563E-4 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 3.682361400802075E-4, + 3.70625831766964E-4, + 3.692070808996729E-4 + ], + [ + 3.6864684928719307E-4, + 3.729608204948727E-4, + 3.7460464471704793E-4 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 3.733489768801373E-4, - "scoreError" : 7.710948014590726E-6, - "scoreConfidence" : [ - 3.6563802886554656E-4, - 3.81059924894728E-4 - ], - "scorePercentiles" : { - "0.0" : 3.682361400802075E-4, - "50.0" : 3.729608204948727E-4, - "90.0" : 3.8100045308045563E-4, - "95.0" : 3.8100045308045563E-4, - "99.0" : 3.8100045308045563E-4, - "99.9" : 3.8100045308045563E-4, - "99.99" : 3.8100045308045563E-4, - "99.999" : 3.8100045308045563E-4, - "99.9999" : 3.8100045308045563E-4, - "100.0" : 3.8100045308045563E-4 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 3.682361400802075E-4, - 3.70625831766964E-4, - 3.692070808996729E-4 - ], - [ - 3.6864684928719307E-4, - 3.729608204948727E-4, - 3.7460464471704793E-4 - ], - [ - 3.784421620702325E-4, - 3.8100045308045563E-4, - 3.7641680952458926E-4 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 3.784421620702325E-4, + 3.8100045308045563E-4, + 3.7641680952458926E-4 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENF1Performance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENF1Performance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 0.01435726879619418, + "scoreError": 4.0347910114715526E-4, + "scoreConfidence": [ + 0.013953789695047025, + 0.014760747897341334 + ], + "scorePercentiles": { + "0.0": 0.014138349409377849, + "50.0": 0.01422107446198828, + "90.0": 0.014705323339239892, + "95.0": 0.014705323339239892, + "99.0": 0.014705323339239892, + "99.9": 0.014705323339239892, + "99.99": 0.014705323339239892, + "99.999": 0.014705323339239892, + "99.9999": 0.014705323339239892, + "100.0": 0.014705323339239892 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.014220843329512714, + 0.014249974604034115, + 0.01422107446198828 + ], + [ + 0.01465220841904762, + 0.0146646087476152, + 0.014705323339239892 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 0.01435726879619418, - "scoreError" : 4.0347910114715526E-4, - "scoreConfidence" : [ - 0.013953789695047025, - 0.014760747897341334 - ], - "scorePercentiles" : { - "0.0" : 0.014138349409377849, - "50.0" : 0.01422107446198828, - "90.0" : 0.014705323339239892, - "95.0" : 0.014705323339239892, - "99.0" : 0.014705323339239892, - "99.9" : 0.014705323339239892, - "99.99" : 0.014705323339239892, - "99.999" : 0.014705323339239892, - "99.9999" : 0.014705323339239892, - "100.0" : 0.014705323339239892 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.014220843329512714, - 0.014249974604034115, - 0.01422107446198828 - ], - [ - 0.01465220841904762, - 0.0146646087476152, - 0.014705323339239892 - ], - [ - 0.014192360439900428, - 0.014170676415031508, - 0.014138349409377849 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.014192360439900428, + 0.014170676415031508, + 0.014138349409377849 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENF2Performance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENF2Performance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 0.9895251951545363, + "scoreError": 0.011617451159531738, + "scoreConfidence": [ + 0.9779077439950046, + 1.001142646314068 + ], + "scorePercentiles": { + "0.0": 0.9812811987047395, + "50.0": 0.9870416658112909, + "90.0": 1.0005223407703852, + "95.0": 1.0005223407703852, + "99.0": 1.0005223407703852, + "99.9": 1.0005223407703852, + "99.99": 1.0005223407703852, + "99.999": 1.0005223407703852, + "99.9999": 1.0005223407703852, + "100.0": 1.0005223407703852 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 1.0005223407703852, + 0.9968223352272727, + 0.9975727868541792 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 0.9895251951545363, - "scoreError" : 0.011617451159531738, - "scoreConfidence" : [ - 0.9779077439950046, - 1.001142646314068 - ], - "scorePercentiles" : { - "0.0" : 0.9812811987047395, - "50.0" : 0.9870416658112909, - "90.0" : 1.0005223407703852, - "95.0" : 1.0005223407703852, - "99.0" : 1.0005223407703852, - "99.9" : 1.0005223407703852, - "99.99" : 1.0005223407703852, - "99.999" : 1.0005223407703852, - "99.9999" : 1.0005223407703852, - "100.0" : 1.0005223407703852 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 1.0005223407703852, - 0.9968223352272727, - 0.9975727868541792 - ], - [ - 0.9870416658112909, - 0.9846626468097677, - 0.9872980485734031 - ], - [ - 0.9837904186915888, - 0.9867353149481993, - 0.9812811987047395 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.9870416658112909, + 0.9846626468097677, + 0.9872980485734031 + ], + [ + 0.9837904186915888, + 0.9867353149481993, + 0.9812811987047395 + ] + ] + }, + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENFDeepIntrospectionPerformance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "5 s", + "measurementBatchSize": 1, + "params": { + "howDeep": "2" }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENFDeepIntrospectionPerformance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "primaryMetric": { + "score": 0.01330986014742821, + "scoreError": 9.891136536444913E-5, + "scoreConfidence": [ + 0.013210948782063761, + 0.013408771512792659 + ], + "scorePercentiles": { + "0.0": 0.01327384584671746, + "50.0": 0.013299086737854359, + "90.0": 0.013362976738343782, + "95.0": 0.013362976738343782, + "99.0": 0.013362976738343782, + "99.9": 0.013362976738343782, + "99.99": 0.013362976738343782, + "99.999": 0.013362976738343782, + "99.9999": 0.013362976738343782, + "100.0": 0.013362976738343782 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.013294660619516086, + 0.01327384584671746, + 0.01330351285619263 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "5 s", - "measurementBatchSize" : 1, - "params" : { - "howDeep" : "2" - }, - "primaryMetric" : { - "score" : 0.01330986014742821, - "scoreError" : 9.891136536444913E-5, - "scoreConfidence" : [ - 0.013210948782063761, - 0.013408771512792659 - ], - "scorePercentiles" : { - "0.0" : 0.01327384584671746, - "50.0" : 0.013299086737854359, - "90.0" : 0.013362976738343782, - "95.0" : 0.013362976738343782, - "99.0" : 0.013362976738343782, - "99.9" : 0.013362976738343782, - "99.99" : 0.013362976738343782, - "99.999" : 0.013362976738343782, - "99.9999" : 0.013362976738343782, - "100.0" : 0.013362976738343782 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.013294660619516086, - 0.01327384584671746, - 0.01330351285619263 - ], - [ - 0.013281905929416514, - 0.01334225889438279, - 0.013362976738343782 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.013281905929416514, + 0.01334225889438279, + 0.013362976738343782 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENFDeepIntrospectionPerformance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENFDeepIntrospectionPerformance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "5 s", + "measurementBatchSize": 1, + "params": { + "howDeep": "10" + }, + "primaryMetric": { + "score": 3.8025668235689842, + "scoreError": 0.06390927980432547, + "scoreConfidence": [ + 3.738657543764659, + 3.8664761033733095 + ], + "scorePercentiles": { + "0.0": 3.7659801807228916, + "50.0": 3.806910667222677, + "90.0": 3.8267197444529457, + "95.0": 3.8267197444529457, + "99.0": 3.8267197444529457, + "99.9": 3.8267197444529457, + "99.99": 3.8267197444529457, + "99.999": 3.8267197444529457, + "99.9999": 3.8267197444529457, + "100.0": 3.8267197444529457 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 3.8143089107551487, + 3.7659801807228916, + 3.820578360580596 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "5 s", - "measurementBatchSize" : 1, - "params" : { - "howDeep" : "10" - }, - "primaryMetric" : { - "score" : 3.8025668235689842, - "scoreError" : 0.06390927980432547, - "scoreConfidence" : [ - 3.738657543764659, - 3.8664761033733095 - ], - "scorePercentiles" : { - "0.0" : 3.7659801807228916, - "50.0" : 3.806910667222677, - "90.0" : 3.8267197444529457, - "95.0" : 3.8267197444529457, - "99.0" : 3.8267197444529457, - "99.9" : 3.8267197444529457, - "99.99" : 3.8267197444529457, - "99.999" : 3.8267197444529457, - "99.9999" : 3.8267197444529457, - "100.0" : 3.8267197444529457 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 3.8143089107551487, - 3.7659801807228916, - 3.820578360580596 - ], - [ - 3.788301321212121, - 3.799512423690205, - 3.8267197444529457 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 3.788301321212121, + 3.799512423690205, + 3.8267197444529457 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENFExtraLargePerformance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENFExtraLargePerformance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 2.9759041347139985, + "scoreError": 0.10713863758918146, + "scoreConfidence": [ + 2.868765497124817, + 3.08304277230318 + ], + "scorePercentiles": { + "0.0": 2.884954732621863, + "50.0": 3.000250045290942, + "90.0": 3.0388375967790946, + "95.0": 3.0388375967790946, + "99.0": 3.0388375967790946, + "99.9": 3.0388375967790946, + "99.99": 3.0388375967790946, + "99.999": 3.0388375967790946, + "99.9999": 3.0388375967790946, + "100.0": 3.0388375967790946 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 3.0026239456619632, + 3.000250045290942, + 2.9838356843675418 + ], + [ + 2.9118269863173216, + 2.884954732621863, + 2.8888414780473717 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 2.9759041347139985, - "scoreError" : 0.10713863758918146, - "scoreConfidence" : [ - 2.868765497124817, - 3.08304277230318 - ], - "scorePercentiles" : { - "0.0" : 2.884954732621863, - "50.0" : 3.000250045290942, - "90.0" : 3.0388375967790946, - "95.0" : 3.0388375967790946, - "99.0" : 3.0388375967790946, - "99.9" : 3.0388375967790946, - "99.99" : 3.0388375967790946, - "99.999" : 3.0388375967790946, - "99.9999" : 3.0388375967790946, - "100.0" : 3.0388375967790946 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 3.0026239456619632, - 3.000250045290942, - 2.9838356843675418 - ], - [ - 2.9118269863173216, - 2.884954732621863, - 2.8888414780473717 - ], - [ - 3.0388375967790946, - 3.038463558323208, - 3.033503185016682 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 3.0388375967790946, + 3.038463558323208, + 3.033503185016682 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkDeepAbstractConcrete", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkDeepAbstractConcrete", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.18603597518816295, + "scoreError": 0.012679982126799527, + "scoreConfidence": [ + 0.17335599306136343, + 0.19871595731496247 + ], + "scorePercentiles": { + "0.0": 0.17767118692369194, + "50.0": 0.18524742478187578, + "90.0": 0.19535688841352633, + "95.0": 0.19535688841352633, + "99.0": 0.19535688841352633, + "99.9": 0.19535688841352633, + "99.99": 0.19535688841352633, + "99.999": 0.19535688841352633, + "99.9999": 0.19535688841352633, + "100.0": 0.19535688841352633 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.18528033961425158, + 0.18524742478187578, + 0.185177052070217 + ], + [ + 0.17788650417133609, + 0.17767118692369194, + 0.1776996488734096 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.18603597518816295, - "scoreError" : 0.012679982126799527, - "scoreConfidence" : [ - 0.17335599306136343, - 0.19871595731496247 - ], - "scorePercentiles" : { - "0.0" : 0.17767118692369194, - "50.0" : 0.18524742478187578, - "90.0" : 0.19535688841352633, - "95.0" : 0.19535688841352633, - "99.0" : 0.19535688841352633, - "99.9" : 0.19535688841352633, - "99.99" : 0.19535688841352633, - "99.999" : 0.19535688841352633, - "99.9999" : 0.19535688841352633, - "100.0" : 0.19535688841352633 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.18528033961425158, - 0.18524742478187578, - 0.185177052070217 - ], - [ - 0.17788650417133609, - 0.17767118692369194, - 0.1776996488734096 - ], - [ - 0.19535688841352633, - 0.19508885146312915, - 0.19491588038202903 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.19535688841352633, + 0.19508885146312915, + 0.19491588038202903 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkNoOverlapFrag", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkNoOverlapFrag", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.32826031013776114, + "scoreError": 0.011022615826861565, + "scoreConfidence": [ + 0.31723769431089954, + 0.33928292596462273 + ], + "scorePercentiles": { + "0.0": 0.320983046477291, + "50.0": 0.32681424316198815, + "90.0": 0.3371025889769088, + "95.0": 0.3371025889769088, + "99.0": 0.3371025889769088, + "99.9": 0.3371025889769088, + "99.99": 0.3371025889769088, + "99.999": 0.3371025889769088, + "99.9999": 0.3371025889769088, + "100.0": 0.3371025889769088 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.3223364937467767, + 0.320983046477291, + 0.3219397327366964 + ], + [ + 0.3371025889769088, + 0.3363084072305364, + 0.3361761716811779 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.32826031013776114, - "scoreError" : 0.011022615826861565, - "scoreConfidence" : [ - 0.31723769431089954, - 0.33928292596462273 - ], - "scorePercentiles" : { - "0.0" : 0.320983046477291, - "50.0" : 0.32681424316198815, - "90.0" : 0.3371025889769088, - "95.0" : 0.3371025889769088, - "99.0" : 0.3371025889769088, - "99.9" : 0.3371025889769088, - "99.99" : 0.3371025889769088, - "99.999" : 0.3371025889769088, - "99.9999" : 0.3371025889769088, - "100.0" : 0.3371025889769088 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.3223364937467767, - 0.320983046477291, - 0.3219397327366964 - ], - [ - 0.3371025889769088, - 0.3363084072305364, - 0.3361761716811779 - ], - [ - 0.32709179727210286, - 0.32681424316198815, - 0.32559030995637167 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.32709179727210286, + 0.32681424316198815, + 0.32559030995637167 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkNoOverlapNoFrag", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkNoOverlapNoFrag", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.16457991754255474, + "scoreError": 0.010323140494181456, + "scoreConfidence": [ + 0.1542567770483733, + 0.1749030580367362 + ], + "scorePercentiles": { + "0.0": 0.1599626444910103, + "50.0": 0.1606458390200803, + "90.0": 0.1729952570276956, + "95.0": 0.1729952570276956, + "99.0": 0.1729952570276956, + "99.9": 0.1729952570276956, + "99.99": 0.1729952570276956, + "99.999": 0.1729952570276956, + "99.9999": 0.1729952570276956, + "100.0": 0.1729952570276956 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.1729952570276956, + 0.17261480054890047, + 0.17268161886342837 + ], + [ + 0.16080234687248754, + 0.1606458390200803, + 0.16053277127813273 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.16457991754255474, - "scoreError" : 0.010323140494181456, - "scoreConfidence" : [ - 0.1542567770483733, - 0.1749030580367362 - ], - "scorePercentiles" : { - "0.0" : 0.1599626444910103, - "50.0" : 0.1606458390200803, - "90.0" : 0.1729952570276956, - "95.0" : 0.1729952570276956, - "99.0" : 0.1729952570276956, - "99.9" : 0.1729952570276956, - "99.99" : 0.1729952570276956, - "99.999" : 0.1729952570276956, - "99.9999" : 0.1729952570276956, - "100.0" : 0.1729952570276956 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.1729952570276956, - 0.17261480054890047, - 0.17268161886342837 - ], - [ - 0.16080234687248754, - 0.1606458390200803, - 0.16053277127813273 - ], - [ - 0.16059716269732932, - 0.16038681708392807, - 0.1599626444910103 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.16059716269732932, + 0.16038681708392807, + 0.1599626444910103 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkOverlapFrag", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkOverlapFrag", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.3934084316923969, + "scoreError": 0.008778638315417864, + "scoreConfidence": [ + 0.38462979337697906, + 0.4021870700078148 + ], + "scorePercentiles": { + "0.0": 0.3879532519300151, + "50.0": 0.39231844958807377, + "90.0": 0.4034614294359719, + "95.0": 0.4034614294359719, + "99.0": 0.4034614294359719, + "99.9": 0.4034614294359719, + "99.99": 0.4034614294359719, + "99.999": 0.4034614294359719, + "99.9999": 0.4034614294359719, + "100.0": 0.4034614294359719 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.3972338251439921, + 0.3963039667512087, + 0.3955053498516907 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.3934084316923969, - "scoreError" : 0.008778638315417864, - "scoreConfidence" : [ - 0.38462979337697906, - 0.4021870700078148 - ], - "scorePercentiles" : { - "0.0" : 0.3879532519300151, - "50.0" : 0.39231844958807377, - "90.0" : 0.4034614294359719, - "95.0" : 0.4034614294359719, - "99.0" : 0.4034614294359719, - "99.9" : 0.4034614294359719, - "99.99" : 0.4034614294359719, - "99.999" : 0.4034614294359719, - "99.9999" : 0.4034614294359719, - "100.0" : 0.4034614294359719 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.3972338251439921, - 0.3963039667512087, - 0.3955053498516907 - ], - [ - 0.4034614294359719, - 0.39231844958807377, - 0.3916460862771207 - ], - [ - 0.3881032016144681, - 0.3879532519300151, - 0.3881503246390312 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.4034614294359719, + 0.39231844958807377, + 0.3916460862771207 + ], + [ + 0.3881032016144681, + 0.3879532519300151, + 0.3881503246390312 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkOverlapNoFrag", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkOverlapNoFrag", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.15900952508569965, + "scoreError": 0.0023946034846080585, + "scoreConfidence": [ + 0.15661492160109158, + 0.16140412857030773 + ], + "scorePercentiles": { + "0.0": 0.15720717609884927, + "50.0": 0.15895266305850936, + "90.0": 0.16082181456048375, + "95.0": 0.16082181456048375, + "99.0": 0.16082181456048375, + "99.9": 0.16082181456048375, + "99.99": 0.16082181456048375, + "99.999": 0.16082181456048375, + "99.9999": 0.16082181456048375, + "100.0": 0.16082181456048375 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.16082181456048375, + 0.16076233775419982, + 0.1602524095476179 + ], + [ + 0.15938672460233974, + 0.15895266305850936, + 0.15877954825188148 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.15900952508569965, - "scoreError" : 0.0023946034846080585, - "scoreConfidence" : [ - 0.15661492160109158, - 0.16140412857030773 - ], - "scorePercentiles" : { - "0.0" : 0.15720717609884927, - "50.0" : 0.15895266305850936, - "90.0" : 0.16082181456048375, - "95.0" : 0.16082181456048375, - "99.0" : 0.16082181456048375, - "99.9" : 0.16082181456048375, - "99.99" : 0.16082181456048375, - "99.999" : 0.16082181456048375, - "99.9999" : 0.16082181456048375, - "100.0" : 0.16082181456048375 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.16082181456048375, - 0.16076233775419982, - 0.1602524095476179 - ], - [ - 0.15938672460233974, - 0.15895266305850936, - 0.15877954825188148 - ], - [ - 0.15768934277334512, - 0.15723370912407036, - 0.15720717609884927 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.15768934277334512, + 0.15723370912407036, + 0.15720717609884927 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkRepeatedFields", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkRepeatedFields", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.047361120540854944, + "scoreError": 0.0011842744715550232, + "scoreConfidence": [ + 0.04617684606929992, + 0.04854539501240997 + ], + "scorePercentiles": { + "0.0": 0.046548068140666095, + "50.0": 0.04735400536040686, + "90.0": 0.04889141967751714, + "95.0": 0.04889141967751714, + "99.0": 0.04889141967751714, + "99.9": 0.04889141967751714, + "99.99": 0.04889141967751714, + "99.999": 0.04889141967751714, + "99.9999": 0.04889141967751714, + "100.0": 0.04889141967751714 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.04889141967751714, + 0.047445435486855404, + 0.04735400536040686 + ], + [ + 0.047628977833767544, + 0.046628790649202896, + 0.046548068140666095 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.047361120540854944, - "scoreError" : 0.0011842744715550232, - "scoreConfidence" : [ - 0.04617684606929992, - 0.04854539501240997 - ], - "scorePercentiles" : { - "0.0" : 0.046548068140666095, - "50.0" : 0.04735400536040686, - "90.0" : 0.04889141967751714, - "95.0" : 0.04889141967751714, - "99.0" : 0.04889141967751714, - "99.9" : 0.04889141967751714, - "99.99" : 0.04889141967751714, - "99.999" : 0.04889141967751714, - "99.9999" : 0.04889141967751714, - "100.0" : 0.04889141967751714 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.04889141967751714, - 0.047445435486855404, - 0.04735400536040686 - ], - [ - 0.047628977833767544, - 0.046628790649202896, - 0.046548068140666095 - ], - [ - 0.04771143517321336, - 0.047044408982495095, - 0.046997543563570054 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.04771143517321336, + 0.047044408982495095, + 0.046997543563570054 + ] + ] + }, + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.overlappingFieldValidationAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.overlappingFieldValidationAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "primaryMetric": { + "score": 9484339.070811357, + "scoreError": 303876.42890579335, + "scoreConfidence": [ + 9180462.641905565, + 9788215.49971715 + ], + "scorePercentiles": { + "0.0": 9283828.396103896, + "50.0": 9397674.42629108, + "90.0": 9777845.836754642, + "95.0": 9777845.836754642, + "99.0": 9777845.836754642, + "99.9": 9777845.836754642, + "99.99": 9777845.836754642, + "99.999": 9777845.836754642, + "99.9999": 9777845.836754642, + "100.0": 9777845.836754642 + }, + "scoreUnit": "ns/op", + "rawData": [ + [ + 9380661.102155576, + 9355213.106641721, + 9283828.396103896 + ], + [ + 9397674.42629108, + 9401537.636278195, + 9390028.017840376 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 9484339.070811357, - "scoreError" : 303876.42890579335, - "scoreConfidence" : [ - 9180462.641905565, - 9788215.49971715 - ], - "scorePercentiles" : { - "0.0" : 9283828.396103896, - "50.0" : 9397674.42629108, - "90.0" : 9777845.836754642, - "95.0" : 9777845.836754642, - "99.0" : 9777845.836754642, - "99.9" : 9777845.836754642, - "99.99" : 9777845.836754642, - "99.999" : 9777845.836754642, - "99.9999" : 9777845.836754642, - "100.0" : 9777845.836754642 - }, - "scoreUnit" : "ns/op", - "rawData" : [ - [ - 9380661.102155576, - 9355213.106641721, - 9283828.396103896 - ], - [ - 9397674.42629108, - 9401537.636278195, - 9390028.017840376 - ], - [ - 9777845.836754642, - 9646593.927675989, - 9725669.187560739 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 9777845.836754642, + 9646593.927675989, + 9725669.187560739 + ] + ] + }, + "secondaryMetrics": { } + } ] diff --git a/performance-results/2025-04-07T02:23:04Z-27b9defd98c4d044b6142c18773188f0dc9113c2-jdk17.json b/performance-results/2025-04-07T02:23:04Z-27b9defd98c4d044b6142c18773188f0dc9113c2-jdk17.json index 5319e247db..007f18eb8c 100644 --- a/performance-results/2025-04-07T02:23:04Z-27b9defd98c4d044b6142c18773188f0dc9113c2-jdk17.json +++ b/performance-results/2025-04-07T02:23:04Z-27b9defd98c4d044b6142c18773188f0dc9113c2-jdk17.json @@ -1,1310 +1,1310 @@ [ - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + { + "jmhVersion": "1.37", + "benchmark": "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 2, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "howManyItems": "5" + }, + "primaryMetric": { + "score": 3.4024128744691158, + "scoreError": 0.04158750625008169, + "scoreConfidence": [ + 3.360825368219034, + 3.4440003807191975 + ], + "scorePercentiles": { + "0.0": 3.3944039605121104, + "50.0": 3.40345905590568, + "90.0": 3.4083294255529943, + "95.0": 3.4083294255529943, + "99.0": 3.4083294255529943, + "99.9": 3.4083294255529943, + "99.99": 3.4083294255529943, + "99.999": 3.4083294255529943, + "99.9999": 3.4083294255529943, + "100.0": 3.4083294255529943 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 3.3944039605121104, + 3.4083294255529943 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 2, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "howManyItems" : "5" - }, - "primaryMetric" : { - "score" : 3.4024128744691158, - "scoreError" : 0.04158750625008169, - "scoreConfidence" : [ - 3.360825368219034, - 3.4440003807191975 - ], - "scorePercentiles" : { - "0.0" : 3.3944039605121104, - "50.0" : 3.40345905590568, - "90.0" : 3.4083294255529943, - "95.0" : 3.4083294255529943, - "99.0" : 3.4083294255529943, - "99.9" : 3.4083294255529943, - "99.99" : 3.4083294255529943, - "99.999" : 3.4083294255529943, - "99.9999" : 3.4083294255529943, - "100.0" : 3.4083294255529943 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 3.3944039605121104, - 3.4083294255529943 - ], - [ - 3.4000739473145463, - 3.406844164496813 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 3.4000739473145463, + 3.406844164496813 + ] + ] + }, + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 2, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "howManyItems": "10" }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "primaryMetric": { + "score": 1.7155725537784197, + "scoreError": 0.037770129964421216, + "scoreConfidence": [ + 1.6778024238139984, + 1.753342683742841 + ], + "scorePercentiles": { + "0.0": 1.710161968644825, + "50.0": 1.7154011487883323, + "90.0": 1.7213259488921897, + "95.0": 1.7213259488921897, + "99.0": 1.7213259488921897, + "99.9": 1.7213259488921897, + "99.99": 1.7213259488921897, + "99.999": 1.7213259488921897, + "99.9999": 1.7213259488921897, + "100.0": 1.7213259488921897 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 1.7198764284685448, + 1.7213259488921897 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 2, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "howManyItems" : "10" - }, - "primaryMetric" : { - "score" : 1.7155725537784197, - "scoreError" : 0.037770129964421216, - "scoreConfidence" : [ - 1.6778024238139984, - 1.753342683742841 - ], - "scorePercentiles" : { - "0.0" : 1.710161968644825, - "50.0" : 1.7154011487883323, - "90.0" : 1.7213259488921897, - "95.0" : 1.7213259488921897, - "99.0" : 1.7213259488921897, - "99.9" : 1.7213259488921897, - "99.99" : 1.7213259488921897, - "99.999" : 1.7213259488921897, - "99.9999" : 1.7213259488921897, - "100.0" : 1.7213259488921897 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 1.7198764284685448, - 1.7213259488921897 - ], - [ - 1.7109258691081197, - 1.710161968644825 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 1.7109258691081197, + 1.710161968644825 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ComplexQueryPerformance.benchMarkSimpleQueriesThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 2, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "howManyItems": "20" + }, + "primaryMetric": { + "score": 0.8640943472992049, + "scoreError": 0.004405615686319763, + "scoreConfidence": [ + 0.8596887316128851, + 0.8684999629855247 + ], + "scorePercentiles": { + "0.0": 0.8632641986249527, + "50.0": 0.8641162781756921, + "90.0": 0.8648806342204824, + "95.0": 0.8648806342204824, + "99.0": 0.8648806342204824, + "99.9": 0.8648806342204824, + "99.99": 0.8648806342204824, + "99.999": 0.8648806342204824, + "99.9999": 0.8648806342204824, + "100.0": 0.8648806342204824 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 0.8648806342204824, + 0.8643237523893058 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 2, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "howManyItems" : "20" - }, - "primaryMetric" : { - "score" : 0.8640943472992049, - "scoreError" : 0.004405615686319763, - "scoreConfidence" : [ - 0.8596887316128851, - 0.8684999629855247 - ], - "scorePercentiles" : { - "0.0" : 0.8632641986249527, - "50.0" : 0.8641162781756921, - "90.0" : 0.8648806342204824, - "95.0" : 0.8648806342204824, - "99.0" : 0.8648806342204824, - "99.9" : 0.8648806342204824, - "99.99" : 0.8648806342204824, - "99.999" : 0.8648806342204824, - "99.9999" : 0.8648806342204824, - "100.0" : 0.8648806342204824 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 0.8648806342204824, - 0.8643237523893058 - ], - [ - 0.8632641986249527, - 0.8639088039620784 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.8632641986249527, + 0.8639088039620784 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.DFSelectionSetPerformance.benchMarkThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.DFSelectionSetPerformance.benchMarkThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 15.917522993984761, + "scoreError": 0.10534551178634009, + "scoreConfidence": [ + 15.812177482198422, + 16.0228685057711 + ], + "scorePercentiles": { + "0.0": 15.847175310824856, + "50.0": 15.886193196714204, + "90.0": 15.998838791758699, + "95.0": 15.998838791758699, + "99.0": 15.998838791758699, + "99.9": 15.998838791758699, + "99.99": 15.998838791758699, + "99.999": 15.998838791758699, + "99.9999": 15.998838791758699, + "100.0": 15.998838791758699 + }, + "scoreUnit": "ops/ms", + "rawData": [ + [ + 15.998658314668303, + 15.885772075707989, + 15.853625494474564 + ], + [ + 15.952482344330894, + 15.972257475645264, + 15.998838791758699 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 15.917522993984761, - "scoreError" : 0.10534551178634009, - "scoreConfidence" : [ - 15.812177482198422, - 16.0228685057711 - ], - "scorePercentiles" : { - "0.0" : 15.847175310824856, - "50.0" : 15.886193196714204, - "90.0" : 15.998838791758699, - "95.0" : 15.998838791758699, - "99.0" : 15.998838791758699, - "99.9" : 15.998838791758699, - "99.99" : 15.998838791758699, - "99.999" : 15.998838791758699, - "99.9999" : 15.998838791758699, - "100.0" : 15.998838791758699 - }, - "scoreUnit" : "ops/ms", - "rawData" : [ - [ - 15.998658314668303, - 15.885772075707989, - 15.853625494474564 - ], - [ - 15.952482344330894, - 15.972257475645264, - 15.998838791758699 - ], - [ - 15.862703941738092, - 15.847175310824856, - 15.886193196714204 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 15.862703941738092, + 15.847175310824856, + 15.886193196714204 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.DFSelectionSetPerformance.benchMarkThroughput_getImmediateFields", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.DFSelectionSetPerformance.benchMarkThroughput_getImmediateFields", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 2651.996925133564, + "scoreError": 102.61405658300019, + "scoreConfidence": [ + 2549.382868550564, + 2754.6109817165643 + ], + "scorePercentiles": { + "0.0": 2594.5766768309095, + "50.0": 2621.8559833967493, + "90.0": 2759.3571287575314, + "95.0": 2759.3571287575314, + "99.0": 2759.3571287575314, + "99.9": 2759.3571287575314, + "99.99": 2759.3571287575314, + "99.999": 2759.3571287575314, + "99.9999": 2759.3571287575314, + "100.0": 2759.3571287575314 + }, + "scoreUnit": "ops/ms", + "rawData": [ + [ + 2642.229533006958, + 2621.8559833967493, + 2614.1465639076587 + ], + [ + 2703.6596783021764, + 2724.2967547863987, + 2759.3571287575314 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 2651.996925133564, - "scoreError" : 102.61405658300019, - "scoreConfidence" : [ - 2549.382868550564, - 2754.6109817165643 - ], - "scorePercentiles" : { - "0.0" : 2594.5766768309095, - "50.0" : 2621.8559833967493, - "90.0" : 2759.3571287575314, - "95.0" : 2759.3571287575314, - "99.0" : 2759.3571287575314, - "99.9" : 2759.3571287575314, - "99.99" : 2759.3571287575314, - "99.999" : 2759.3571287575314, - "99.9999" : 2759.3571287575314, - "100.0" : 2759.3571287575314 - }, - "scoreUnit" : "ops/ms", - "rawData" : [ - [ - 2642.229533006958, - 2621.8559833967493, - 2614.1465639076587 - ], - [ - 2703.6596783021764, - 2724.2967547863987, - 2759.3571287575314 - ], - [ - 2609.049711493145, - 2598.8002957205467, - 2594.5766768309095 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 2609.049711493145, + 2598.8002957205467, + 2594.5766768309095 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENF1Performance.benchMarkThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENF1Performance.benchMarkThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 68612.0898374958, + "scoreError": 919.1459755874994, + "scoreConfidence": [ + 67692.94386190831, + 69531.2358130833 + ], + "scorePercentiles": { + "0.0": 67452.23010905962, + "50.0": 68636.00030823321, + "90.0": 69250.59981145305, + "95.0": 69250.59981145305, + "99.0": 69250.59981145305, + "99.9": 69250.59981145305, + "99.99": 69250.59981145305, + "99.999": 69250.59981145305, + "99.9999": 69250.59981145305, + "100.0": 69250.59981145305 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 68357.6305934753, + 68326.28436629583, + 67452.23010905962 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 68612.0898374958, - "scoreError" : 919.1459755874994, - "scoreConfidence" : [ - 67692.94386190831, - 69531.2358130833 - ], - "scorePercentiles" : { - "0.0" : 67452.23010905962, - "50.0" : 68636.00030823321, - "90.0" : 69250.59981145305, - "95.0" : 69250.59981145305, - "99.0" : 69250.59981145305, - "99.9" : 69250.59981145305, - "99.99" : 69250.59981145305, - "99.999" : 69250.59981145305, - "99.9999" : 69250.59981145305, - "100.0" : 69250.59981145305 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 68357.6305934753, - 68326.28436629583, - 67452.23010905962 - ], - [ - 68968.79799847226, - 69250.59981145305, - 69213.97860275264 - ], - [ - 68631.82410693438, - 68636.00030823321, - 68671.46264078599 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 68968.79799847226, + 69250.59981145305, + 69213.97860275264 + ], + [ + 68631.82410693438, + 68636.00030823321, + 68671.46264078599 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENFExtraLargePerformance.benchMarkThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENFExtraLargePerformance.benchMarkThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 330.4601630317331, + "scoreError": 9.658737192895103, + "scoreConfidence": [ + 320.801425838838, + 340.1189002246282 + ], + "scorePercentiles": { + "0.0": 323.1202470082651, + "50.0": 328.76437581551824, + "90.0": 341.84570372389413, + "95.0": 341.84570372389413, + "99.0": 341.84570372389413, + "99.9": 341.84570372389413, + "99.99": 341.84570372389413, + "99.999": 341.84570372389413, + "99.9999": 341.84570372389413, + "100.0": 341.84570372389413 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 329.79261883074423, + 327.7660443555497, + 328.76437581551824 + ], + [ + 333.16257444872934, + 341.84570372389413, + 336.19328864061754 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 330.4601630317331, - "scoreError" : 9.658737192895103, - "scoreConfidence" : [ - 320.801425838838, - 340.1189002246282 - ], - "scorePercentiles" : { - "0.0" : 323.1202470082651, - "50.0" : 328.76437581551824, - "90.0" : 341.84570372389413, - "95.0" : 341.84570372389413, - "99.0" : 341.84570372389413, - "99.9" : 341.84570372389413, - "99.99" : 341.84570372389413, - "99.999" : 341.84570372389413, - "99.9999" : 341.84570372389413, - "100.0" : 341.84570372389413 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 329.79261883074423, - 327.7660443555497, - 328.76437581551824 - ], - [ - 333.16257444872934, - 341.84570372389413, - 336.19328864061754 - ], - [ - 325.6343215111571, - 323.1202470082651, - 327.86229295112247 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 325.6343215111571, + 323.1202470082651, + 327.86229295112247 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.overlappingFieldValidationThroughput", - "mode" : "thrpt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.overlappingFieldValidationThroughput", + "mode": "thrpt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 100.12561032974878, + "scoreError": 2.8985841561115095, + "scoreConfidence": [ + 97.22702617363727, + 103.02419448586029 + ], + "scorePercentiles": { + "0.0": 97.95482936466934, + "50.0": 100.3875153367714, + "90.0": 103.3944677652683, + "95.0": 103.3944677652683, + "99.0": 103.3944677652683, + "99.9": 103.3944677652683, + "99.99": 103.3944677652683, + "99.999": 103.3944677652683, + "99.9999": 103.3944677652683, + "100.0": 103.3944677652683 + }, + "scoreUnit": "ops/s", + "rawData": [ + [ + 100.8323274119472, + 100.4198752326016, + 98.84554145420253 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 100.12561032974878, - "scoreError" : 2.8985841561115095, - "scoreConfidence" : [ - 97.22702617363727, - 103.02419448586029 - ], - "scorePercentiles" : { - "0.0" : 97.95482936466934, - "50.0" : 100.3875153367714, - "90.0" : 103.3944677652683, - "95.0" : 103.3944677652683, - "99.0" : 103.3944677652683, - "99.9" : 103.3944677652683, - "99.99" : 103.3944677652683, - "99.999" : 103.3944677652683, - "99.9999" : 103.3944677652683, - "100.0" : 103.3944677652683 - }, - "scoreUnit" : "ops/s", - "rawData" : [ - [ - 100.8323274119472, - 100.4198752326016, - 98.84554145420253 - ], - [ - 99.6008992466689, - 97.95482936466934, - 98.16208928086066 - ], - [ - 100.3875153367714, - 103.3944677652683, - 101.5329478747493 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 99.6008992466689, + 97.95482936466934, + 98.16208928086066 + ], + [ + 100.3875153367714, + 103.3944677652683, + 101.5329478747493 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.DFSelectionSetPerformance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.DFSelectionSetPerformance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 0.06316792203283529, + "scoreError": 8.270715540534216E-4, + "scoreConfidence": [ + 0.06234085047878187, + 0.06399499358688872 + ], + "scorePercentiles": { + "0.0": 0.06222177331723889, + "50.0": 0.06337011391907735, + "90.0": 0.06358116983507331, + "95.0": 0.06358116983507331, + "99.0": 0.06358116983507331, + "99.9": 0.06358116983507331, + "99.99": 0.06358116983507331, + "99.999": 0.06358116983507331, + "99.9999": 0.06358116983507331, + "100.0": 0.06358116983507331 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.06349092706263293, + 0.06334888231195125, + 0.06337011391907735 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 0.06316792203283529, - "scoreError" : 8.270715540534216E-4, - "scoreConfidence" : [ - 0.06234085047878187, - 0.06399499358688872 - ], - "scorePercentiles" : { - "0.0" : 0.06222177331723889, - "50.0" : 0.06337011391907735, - "90.0" : 0.06358116983507331, - "95.0" : 0.06358116983507331, - "99.0" : 0.06358116983507331, - "99.9" : 0.06358116983507331, - "99.99" : 0.06358116983507331, - "99.999" : 0.06358116983507331, - "99.9999" : 0.06358116983507331, - "100.0" : 0.06358116983507331 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.06349092706263293, - 0.06334888231195125, - 0.06337011391907735 - ], - [ - 0.0635717372429357, - 0.06358116983507331, - 0.06350392368850533 - ], - [ - 0.06273545851996838, - 0.06222177331723889, - 0.06268731239813445 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.0635717372429357, + 0.06358116983507331, + 0.06350392368850533 + ], + [ + 0.06273545851996838, + 0.06222177331723889, + 0.06268731239813445 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.DFSelectionSetPerformance.benchMarkAvgTime_getImmediateFields", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.DFSelectionSetPerformance.benchMarkAvgTime_getImmediateFields", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 3.8155791647813083E-4, + "scoreError": 3.3424823701870774E-6, + "scoreConfidence": [ + 3.7821543410794376E-4, + 3.849003988483179E-4 + ], + "scorePercentiles": { + "0.0": 3.7877016592745467E-4, + "50.0": 3.822095981027384E-4, + "90.0": 3.842126257983555E-4, + "95.0": 3.842126257983555E-4, + "99.0": 3.842126257983555E-4, + "99.9": 3.842126257983555E-4, + "99.99": 3.842126257983555E-4, + "99.999": 3.842126257983555E-4, + "99.9999": 3.842126257983555E-4, + "100.0": 3.842126257983555E-4 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 3.822095981027384E-4, + 3.8229752960112107E-4, + 3.801560559184481E-4 + ], + [ + 3.7877016592745467E-4, + 3.7948895620940705E-4, + 3.800347896686719E-4 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 3.8155791647813083E-4, - "scoreError" : 3.3424823701870774E-6, - "scoreConfidence" : [ - 3.7821543410794376E-4, - 3.849003988483179E-4 - ], - "scorePercentiles" : { - "0.0" : 3.7877016592745467E-4, - "50.0" : 3.822095981027384E-4, - "90.0" : 3.842126257983555E-4, - "95.0" : 3.842126257983555E-4, - "99.0" : 3.842126257983555E-4, - "99.9" : 3.842126257983555E-4, - "99.99" : 3.842126257983555E-4, - "99.999" : 3.842126257983555E-4, - "99.9999" : 3.842126257983555E-4, - "100.0" : 3.842126257983555E-4 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 3.822095981027384E-4, - 3.8229752960112107E-4, - 3.801560559184481E-4 - ], - [ - 3.7877016592745467E-4, - 3.7948895620940705E-4, - 3.800347896686719E-4 - ], - [ - 3.838236461244403E-4, - 3.8302788095254055E-4, - 3.842126257983555E-4 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 3.838236461244403E-4, + 3.8302788095254055E-4, + 3.842126257983555E-4 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENF1Performance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENF1Performance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 0.014208448375770424, + "scoreError": 4.036614484293156E-5, + "scoreConfidence": [ + 0.014168082230927493, + 0.014248814520613355 + ], + "scorePercentiles": { + "0.0": 0.014178370370107812, + "50.0": 0.014204685320049261, + "90.0": 0.014251159324333375, + "95.0": 0.014251159324333375, + "99.0": 0.014251159324333375, + "99.9": 0.014251159324333375, + "99.99": 0.014251159324333375, + "99.999": 0.014251159324333375, + "99.9999": 0.014251159324333375, + "100.0": 0.014251159324333375 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.01422632329773477, + 0.014251159324333375, + 0.014191335593985218 + ], + [ + 0.014178370370107812, + 0.014186347490183172, + 0.01419074600570745 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 0.014208448375770424, - "scoreError" : 4.036614484293156E-5, - "scoreConfidence" : [ - 0.014168082230927493, - 0.014248814520613355 - ], - "scorePercentiles" : { - "0.0" : 0.014178370370107812, - "50.0" : 0.014204685320049261, - "90.0" : 0.014251159324333375, - "95.0" : 0.014251159324333375, - "99.0" : 0.014251159324333375, - "99.9" : 0.014251159324333375, - "99.99" : 0.014251159324333375, - "99.999" : 0.014251159324333375, - "99.9999" : 0.014251159324333375, - "100.0" : 0.014251159324333375 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.01422632329773477, - 0.014251159324333375, - 0.014191335593985218 - ], - [ - 0.014178370370107812, - 0.014186347490183172, - 0.01419074600570745 - ], - [ - 0.014204685320049261, - 0.014222163774860056, - 0.014224904204972681 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.014204685320049261, + 0.014222163774860056, + 0.014224904204972681 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENF2Performance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENF2Performance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 0.9891671827289721, + "scoreError": 0.005271542909133186, + "scoreConfidence": [ + 0.9838956398198389, + 0.9944387256381053 + ], + "scorePercentiles": { + "0.0": 0.9848689664171755, + "50.0": 0.9887918086810362, + "90.0": 0.9937846931332605, + "95.0": 0.9937846931332605, + "99.0": 0.9937846931332605, + "99.9": 0.9937846931332605, + "99.99": 0.9937846931332605, + "99.999": 0.9937846931332605, + "99.9999": 0.9937846931332605, + "100.0": 0.9937846931332605 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.9887918086810362, + 0.9876427126209757, + 0.9872937858623754 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 0.9891671827289721, - "scoreError" : 0.005271542909133186, - "scoreConfidence" : [ - 0.9838956398198389, - 0.9944387256381053 - ], - "scorePercentiles" : { - "0.0" : 0.9848689664171755, - "50.0" : 0.9887918086810362, - "90.0" : 0.9937846931332605, - "95.0" : 0.9937846931332605, - "99.0" : 0.9937846931332605, - "99.9" : 0.9937846931332605, - "99.99" : 0.9937846931332605, - "99.999" : 0.9937846931332605, - "99.9999" : 0.9937846931332605, - "100.0" : 0.9937846931332605 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.9887918086810362, - 0.9876427126209757, - 0.9872937858623754 - ], - [ - 0.9858262918966877, - 0.9848689664171755, - 0.989383180846854 - ], - [ - 0.992224959718226, - 0.9937846931332605, - 0.9926882453841572 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.9858262918966877, + 0.9848689664171755, + 0.989383180846854 + ], + [ + 0.992224959718226, + 0.9937846931332605, + 0.9926882453841572 + ] + ] + }, + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENFDeepIntrospectionPerformance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "5 s", + "measurementBatchSize": 1, + "params": { + "howDeep": "2" }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENFDeepIntrospectionPerformance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "primaryMetric": { + "score": 0.013286598302855711, + "scoreError": 2.885899395432918E-4, + "scoreConfidence": [ + 0.01299800836331242, + 0.013575188242399002 + ], + "scorePercentiles": { + "0.0": 0.013133001691491848, + "50.0": 0.013278352595363613, + "90.0": 0.01340046419478466, + "95.0": 0.01340046419478466, + "99.0": 0.01340046419478466, + "99.9": 0.01340046419478466, + "99.99": 0.01340046419478466, + "99.999": 0.01340046419478466, + "99.9999": 0.01340046419478466, + "100.0": 0.01340046419478466 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.013133001691491848, + 0.013239373324930958, + 0.013238407885644388 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "5 s", - "measurementBatchSize" : 1, - "params" : { - "howDeep" : "2" - }, - "primaryMetric" : { - "score" : 0.013286598302855711, - "scoreError" : 2.885899395432918E-4, - "scoreConfidence" : [ - 0.01299800836331242, - 0.013575188242399002 - ], - "scorePercentiles" : { - "0.0" : 0.013133001691491848, - "50.0" : 0.013278352595363613, - "90.0" : 0.01340046419478466, - "95.0" : 0.01340046419478466, - "99.0" : 0.01340046419478466, - "99.9" : 0.01340046419478466, - "99.99" : 0.01340046419478466, - "99.999" : 0.01340046419478466, - "99.9999" : 0.01340046419478466, - "100.0" : 0.01340046419478466 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.013133001691491848, - 0.013239373324930958, - 0.013238407885644388 - ], - [ - 0.013317331865796266, - 0.013391010854486147, - 0.01340046419478466 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.013317331865796266, + 0.013391010854486147, + 0.01340046419478466 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENFDeepIntrospectionPerformance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 2, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENFDeepIntrospectionPerformance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 2, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "5 s", + "measurementBatchSize": 1, + "params": { + "howDeep": "10" + }, + "primaryMetric": { + "score": 3.9518865488084622, + "scoreError": 0.1620644508117164, + "scoreConfidence": [ + 3.789822097996746, + 4.113950999620179 + ], + "scorePercentiles": { + "0.0": 3.8908548794712288, + "50.0": 3.9458725575215814, + "90.0": 4.017380144578313, + "95.0": 4.017380144578313, + "99.0": 4.017380144578313, + "99.9": 4.017380144578313, + "99.99": 4.017380144578313, + "99.999": 4.017380144578313, + "99.9999": 4.017380144578313, + "100.0": 4.017380144578313 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 3.971634164416203, + 4.017380144578313, + 4.015910879614768 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "5 s", - "measurementBatchSize" : 1, - "params" : { - "howDeep" : "10" - }, - "primaryMetric" : { - "score" : 3.9518865488084622, - "scoreError" : 0.1620644508117164, - "scoreConfidence" : [ - 3.789822097996746, - 4.113950999620179 - ], - "scorePercentiles" : { - "0.0" : 3.8908548794712288, - "50.0" : 3.9458725575215814, - "90.0" : 4.017380144578313, - "95.0" : 4.017380144578313, - "99.0" : 4.017380144578313, - "99.9" : 4.017380144578313, - "99.99" : 4.017380144578313, - "99.999" : 4.017380144578313, - "99.9999" : 4.017380144578313, - "100.0" : 4.017380144578313 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 3.971634164416203, - 4.017380144578313, - 4.015910879614768 - ], - [ - 3.895428274143302, - 3.8908548794712288, - 3.920110950626959 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 3.895428274143302, + 3.8908548794712288, + 3.920110950626959 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.ENFExtraLargePerformance.benchMarkAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.ENFExtraLargePerformance.benchMarkAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "primaryMetric": { + "score": 3.0523075817714425, + "scoreError": 0.06250911760604816, + "scoreConfidence": [ + 2.9897984641653945, + 3.1148166993774904 + ], + "scorePercentiles": { + "0.0": 2.9699671710213775, + "50.0": 3.0696655647636586, + "90.0": 3.086972935802469, + "95.0": 3.086972935802469, + "99.0": 3.086972935802469, + "99.9": 3.086972935802469, + "99.99": 3.086972935802469, + "99.999": 3.086972935802469, + "99.9999": 3.086972935802469, + "100.0": 3.086972935802469 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 3.0423442236081533, + 3.08352511621455, + 3.072799676497696 + ], + [ + 3.031278664746893, + 3.086972935802469, + 3.077165876 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "primaryMetric" : { - "score" : 3.0523075817714425, - "scoreError" : 0.06250911760604816, - "scoreConfidence" : [ - 2.9897984641653945, - 3.1148166993774904 - ], - "scorePercentiles" : { - "0.0" : 2.9699671710213775, - "50.0" : 3.0696655647636586, - "90.0" : 3.086972935802469, - "95.0" : 3.086972935802469, - "99.0" : 3.086972935802469, - "99.9" : 3.086972935802469, - "99.99" : 3.086972935802469, - "99.999" : 3.086972935802469, - "99.9999" : 3.086972935802469, - "100.0" : 3.086972935802469 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 3.0423442236081533, - 3.08352511621455, - 3.072799676497696 - ], - [ - 3.031278664746893, - 3.086972935802469, - 3.077165876 - ], - [ - 3.0696655647636586, - 2.9699671710213775, - 3.037049007288187 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 3.0696655647636586, + 2.9699671710213775, + 3.037049007288187 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkDeepAbstractConcrete", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkDeepAbstractConcrete", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.18166747949930095, + "scoreError": 0.006648671920999719, + "scoreConfidence": [ + 0.17501880757830124, + 0.18831615142030067 + ], + "scorePercentiles": { + "0.0": 0.1764090981160034, + "50.0": 0.18331922956499422, + "90.0": 0.1866240205467948, + "95.0": 0.1866240205467948, + "99.0": 0.1866240205467948, + "99.9": 0.1866240205467948, + "99.99": 0.1866240205467948, + "99.999": 0.1866240205467948, + "99.9999": 0.1866240205467948, + "100.0": 0.1866240205467948 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.1866240205467948, + 0.18308862911021603, + 0.18331922956499422 + ], + [ + 0.18389326961622626, + 0.1843292598982526, + 0.18405789231024075 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.18166747949930095, - "scoreError" : 0.006648671920999719, - "scoreConfidence" : [ - 0.17501880757830124, - 0.18831615142030067 - ], - "scorePercentiles" : { - "0.0" : 0.1764090981160034, - "50.0" : 0.18331922956499422, - "90.0" : 0.1866240205467948, - "95.0" : 0.1866240205467948, - "99.0" : 0.1866240205467948, - "99.9" : 0.1866240205467948, - "99.99" : 0.1866240205467948, - "99.999" : 0.1866240205467948, - "99.9999" : 0.1866240205467948, - "100.0" : 0.1866240205467948 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.1866240205467948, - 0.18308862911021603, - 0.18331922956499422 - ], - [ - 0.18389326961622626, - 0.1843292598982526, - 0.18405789231024075 - ], - [ - 0.1767467385779176, - 0.1764090981160034, - 0.17653917775306288 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.1767467385779176, + 0.1764090981160034, + 0.17653917775306288 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkNoOverlapFrag", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkNoOverlapFrag", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.32936443132369997, + "scoreError": 0.016700051163016847, + "scoreConfidence": [ + 0.3126643801606831, + 0.34606448248671684 + ], + "scorePercentiles": { + "0.0": 0.3160410036028064, + "50.0": 0.33423063933823527, + "90.0": 0.3384082277757098, + "95.0": 0.3384082277757098, + "99.0": 0.3384082277757098, + "99.9": 0.3384082277757098, + "99.99": 0.3384082277757098, + "99.999": 0.3384082277757098, + "99.9999": 0.3384082277757098, + "100.0": 0.3384082277757098 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.3384082277757098, + 0.3366214163188367, + 0.3374201485930225 + ], + [ + 0.335473614747224, + 0.33423063933823527, + 0.33330557534246574 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.32936443132369997, - "scoreError" : 0.016700051163016847, - "scoreConfidence" : [ - 0.3126643801606831, - 0.34606448248671684 - ], - "scorePercentiles" : { - "0.0" : 0.3160410036028064, - "50.0" : 0.33423063933823527, - "90.0" : 0.3384082277757098, - "95.0" : 0.3384082277757098, - "99.0" : 0.3384082277757098, - "99.9" : 0.3384082277757098, - "99.99" : 0.3384082277757098, - "99.999" : 0.3384082277757098, - "99.9999" : 0.3384082277757098, - "100.0" : 0.3384082277757098 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.3384082277757098, - 0.3366214163188367, - 0.3374201485930225 - ], - [ - 0.335473614747224, - 0.33423063933823527, - 0.33330557534246574 - ], - [ - 0.3160410036028064, - 0.3164667069936709, - 0.3163125492013285 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.3160410036028064, + 0.3164667069936709, + 0.3163125492013285 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkNoOverlapNoFrag", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkNoOverlapNoFrag", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.15942278226557283, + "scoreError": 0.0011649283398282816, + "scoreConfidence": [ + 0.15825785392574454, + 0.1605877106054011 + ], + "scorePercentiles": { + "0.0": 0.158541066569431, + "50.0": 0.15914956365083155, + "90.0": 0.16043488962330746, + "95.0": 0.16043488962330746, + "99.0": 0.16043488962330746, + "99.9": 0.16043488962330746, + "99.99": 0.16043488962330746, + "99.999": 0.16043488962330746, + "99.9999": 0.16043488962330746, + "100.0": 0.16043488962330746 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.16024201910042143, + 0.16010645414665386, + 0.16043488962330746 + ], + [ + 0.158541066569431, + 0.1588924116656339, + 0.15914956365083155 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.15942278226557283, - "scoreError" : 0.0011649283398282816, - "scoreConfidence" : [ - 0.15825785392574454, - 0.1605877106054011 - ], - "scorePercentiles" : { - "0.0" : 0.158541066569431, - "50.0" : 0.15914956365083155, - "90.0" : 0.16043488962330746, - "95.0" : 0.16043488962330746, - "99.0" : 0.16043488962330746, - "99.9" : 0.16043488962330746, - "99.99" : 0.16043488962330746, - "99.999" : 0.16043488962330746, - "99.9999" : 0.16043488962330746, - "100.0" : 0.16043488962330746 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.16024201910042143, - 0.16010645414665386, - 0.16043488962330746 - ], - [ - 0.158541066569431, - 0.1588924116656339, - 0.15914956365083155 - ], - [ - 0.1595501935288299, - 0.15875188312987157, - 0.15913655897517504 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.1595501935288299, + 0.15875188312987157, + 0.15913655897517504 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkOverlapFrag", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkOverlapFrag", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.38738454017209295, + "scoreError": 0.005927807766160227, + "scoreConfidence": [ + 0.3814567324059327, + 0.3933123479382532 + ], + "scorePercentiles": { + "0.0": 0.382517749684428, + "50.0": 0.3899068544525889, + "90.0": 0.39072758224583887, + "95.0": 0.39072758224583887, + "99.0": 0.39072758224583887, + "99.9": 0.39072758224583887, + "99.99": 0.39072758224583887, + "99.999": 0.39072758224583887, + "99.9999": 0.39072758224583887, + "100.0": 0.39072758224583887 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.39072758224583887, + 0.3852419058130128, + 0.38403093575268815 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.38738454017209295, - "scoreError" : 0.005927807766160227, - "scoreConfidence" : [ - 0.3814567324059327, - 0.3933123479382532 - ], - "scorePercentiles" : { - "0.0" : 0.382517749684428, - "50.0" : 0.3899068544525889, - "90.0" : 0.39072758224583887, - "95.0" : 0.39072758224583887, - "99.0" : 0.39072758224583887, - "99.9" : 0.39072758224583887, - "99.99" : 0.39072758224583887, - "99.999" : 0.39072758224583887, - "99.9999" : 0.39072758224583887, - "100.0" : 0.39072758224583887 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.39072758224583887, - 0.3852419058130128, - 0.38403093575268815 - ], - [ - 0.39006229202745923, - 0.3832175821965052, - 0.382517749684428 - ], - [ - 0.3905045636299738, - 0.3902513957463415, - 0.3899068544525889 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.39006229202745923, + 0.3832175821965052, + 0.382517749684428 + ], + [ + 0.3905045636299738, + 0.3902513957463415, + 0.3899068544525889 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkOverlapNoFrag", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkOverlapNoFrag", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.15627878522040609, + "scoreError": 7.785367456182951E-4, + "scoreConfidence": [ + 0.1555002484747878, + 0.15705732196602437 + ], + "scorePercentiles": { + "0.0": 0.15560179941806188, + "50.0": 0.15620902129088693, + "90.0": 0.1568640207839877, + "95.0": 0.1568640207839877, + "99.0": 0.1568640207839877, + "99.9": 0.1568640207839877, + "99.99": 0.1568640207839877, + "99.999": 0.1568640207839877, + "99.9999": 0.1568640207839877, + "100.0": 0.1568640207839877 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.15640216331190665, + 0.15572468925673888, + 0.15560179941806188 + ], + [ + 0.1568640207839877, + 0.1567813124872619, + 0.15676521391732376 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.15627878522040609, - "scoreError" : 7.785367456182951E-4, - "scoreConfidence" : [ - 0.1555002484747878, - 0.15705732196602437 - ], - "scorePercentiles" : { - "0.0" : 0.15560179941806188, - "50.0" : 0.15620902129088693, - "90.0" : 0.1568640207839877, - "95.0" : 0.1568640207839877, - "99.0" : 0.1568640207839877, - "99.9" : 0.1568640207839877, - "99.99" : 0.1568640207839877, - "99.999" : 0.1568640207839877, - "99.9999" : 0.1568640207839877, - "100.0" : 0.1568640207839877 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.15640216331190665, - 0.15572468925673888, - 0.15560179941806188 - ], - [ - 0.1568640207839877, - 0.1567813124872619, - 0.15676521391732376 - ], - [ - 0.15597704858533237, - 0.15620902129088693, - 0.15618379793215467 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.15597704858533237, + 0.15620902129088693, + 0.15618379793215467 + ] + ] }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.benchmarkRepeatedFields", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.benchmarkRepeatedFields", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" + }, + "primaryMetric": { + "score": 0.04806022908342739, + "scoreError": 0.0026399188420189288, + "scoreConfidence": [ + 0.04542031024140846, + 0.050700147925446325 + ], + "scorePercentiles": { + "0.0": 0.046529167814369866, + "50.0": 0.04744658384179611, + "90.0": 0.050145358333792994, + "95.0": 0.050145358333792994, + "99.0": 0.050145358333792994, + "99.9": 0.050145358333792994, + "99.99": 0.050145358333792994, + "99.999": 0.050145358333792994, + "99.9999": 0.050145358333792994, + "100.0": 0.050145358333792994 + }, + "scoreUnit": "ms/op", + "rawData": [ + [ + 0.047653858208243985, + 0.04744658384179611, + 0.047323675478198324 + ], + [ + 0.050145358333792994, + 0.05012683766673183, + 0.049999637767244656 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 0.04806022908342739, - "scoreError" : 0.0026399188420189288, - "scoreConfidence" : [ - 0.04542031024140846, - 0.050700147925446325 - ], - "scorePercentiles" : { - "0.0" : 0.046529167814369866, - "50.0" : 0.04744658384179611, - "90.0" : 0.050145358333792994, - "95.0" : 0.050145358333792994, - "99.0" : 0.050145358333792994, - "99.9" : 0.050145358333792994, - "99.99" : 0.050145358333792994, - "99.999" : 0.050145358333792994, - "99.9999" : 0.050145358333792994, - "100.0" : 0.050145358333792994 - }, - "scoreUnit" : "ms/op", - "rawData" : [ - [ - 0.047653858208243985, - 0.04744658384179611, - 0.047323675478198324 - ], - [ - 0.050145358333792994, - 0.05012683766673183, - 0.049999637767244656 - ], - [ - 0.0466059831382126, - 0.046529167814369866, - 0.0467109595022561 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 0.0466059831382126, + 0.046529167814369866, + 0.0467109595022561 + ] + ] + }, + "secondaryMetrics": { + } + }, + { + "jmhVersion": "1.37", + "benchmark": "performance.OverlappingFieldValidationPerformance.overlappingFieldValidationAvgTime", + "mode": "avgt", + "threads": 1, + "forks": 3, + "jvm": "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", + "jvmArgs": [ + ], + "jdkVersion": "17.0.10", + "vmName": "OpenJDK 64-Bit Server VM", + "vmVersion": "17.0.10+7-LTS", + "warmupIterations": 2, + "warmupTime": "5 s", + "warmupBatchSize": 1, + "measurementIterations": 3, + "measurementTime": "10 s", + "measurementBatchSize": 1, + "params": { + "size": "100" }, - { - "jmhVersion" : "1.37", - "benchmark" : "performance.OverlappingFieldValidationPerformance.overlappingFieldValidationAvgTime", - "mode" : "avgt", - "threads" : 1, - "forks" : 3, - "jvm" : "/home/ec2-user/.sdkman/candidates/java/17.0.10-amzn/bin/java", - "jvmArgs" : [ + "primaryMetric": { + "score": 1.0190032978742655E7, + "scoreError": 360464.8084112424, + "scoreConfidence": [ + 9829568.170331413, + 1.0550497787153898E7 + ], + "scorePercentiles": { + "0.0": 9784278.565982405, + "50.0": 1.0226893349693252E7, + "90.0": 1.051854128811777E7, + "95.0": 1.051854128811777E7, + "99.0": 1.051854128811777E7, + "99.9": 1.051854128811777E7, + "99.99": 1.051854128811777E7, + "99.999": 1.051854128811777E7, + "99.9999": 1.051854128811777E7, + "100.0": 1.051854128811777E7 + }, + "scoreUnit": "ns/op", + "rawData": [ + [ + 1.0004127156E7, + 1.0086599470766129E7, + 9784278.565982405 + ], + [ + 1.0226893349693252E7, + 1.0233475158486707E7, + 1.020059461365953E7 ], - "jdkVersion" : "17.0.10", - "vmName" : "OpenJDK 64-Bit Server VM", - "vmVersion" : "17.0.10+7-LTS", - "warmupIterations" : 2, - "warmupTime" : "5 s", - "warmupBatchSize" : 1, - "measurementIterations" : 3, - "measurementTime" : "10 s", - "measurementBatchSize" : 1, - "params" : { - "size" : "100" - }, - "primaryMetric" : { - "score" : 1.0190032978742655E7, - "scoreError" : 360464.8084112424, - "scoreConfidence" : [ - 9829568.170331413, - 1.0550497787153898E7 - ], - "scorePercentiles" : { - "0.0" : 9784278.565982405, - "50.0" : 1.0226893349693252E7, - "90.0" : 1.051854128811777E7, - "95.0" : 1.051854128811777E7, - "99.0" : 1.051854128811777E7, - "99.9" : 1.051854128811777E7, - "99.99" : 1.051854128811777E7, - "99.999" : 1.051854128811777E7, - "99.9999" : 1.051854128811777E7, - "100.0" : 1.051854128811777E7 - }, - "scoreUnit" : "ns/op", - "rawData" : [ - [ - 1.0004127156E7, - 1.0086599470766129E7, - 9784278.565982405 - ], - [ - 1.0226893349693252E7, - 1.0233475158486707E7, - 1.020059461365953E7 - ], - [ - 1.026109897025641E7, - 1.0394688235721704E7, - 1.051854128811777E7 - ] - ] - }, - "secondaryMetrics" : { - } + [ + 1.026109897025641E7, + 1.0394688235721704E7, + 1.051854128811777E7 + ] + ] + }, + "secondaryMetrics": { } + } ] diff --git a/src/jmh/java/performance/DataLoaderPerformance.java b/src/jmh/java/performance/DataLoaderPerformance.java index f36c4b2fcf..c2ac65a475 100644 --- a/src/jmh/java/performance/DataLoaderPerformance.java +++ b/src/jmh/java/performance/DataLoaderPerformance.java @@ -4,6 +4,7 @@ import graphql.ExecutionInput; import graphql.ExecutionResult; import graphql.GraphQL; +import graphql.execution.instrumentation.dataloader.DataLoaderDispatchingContextKeys; import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.schema.idl.RuntimeWiring; @@ -184,6 +185,7 @@ public void executeRequestWithDataLoaders(MyState myState, Blackhole blackhole) DataLoaderRegistry registry = DataLoaderRegistry.newRegistry().register(ownerDLName, ownerDL).register(petDLName, petDL).build(); ExecutionInput executionInput = ExecutionInput.newExecutionInput().query(myState.query).dataLoaderRegistry(registry).build(); + executionInput.getGraphQLContext().put(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING, true); ExecutionResult execute = myState.graphQL.execute(executionInput); Assert.assertTrue(execute.isDataPresent()); Assert.assertTrue(execute.getErrors().isEmpty()); diff --git a/src/main/java/graphql/execution/DataLoaderDispatchStrategy.java b/src/main/java/graphql/execution/DataLoaderDispatchStrategy.java index 5101ae3a56..d91bf46814 100644 --- a/src/main/java/graphql/execution/DataLoaderDispatchStrategy.java +++ b/src/main/java/graphql/execution/DataLoaderDispatchStrategy.java @@ -2,8 +2,10 @@ import graphql.Internal; import graphql.schema.DataFetcher; +import graphql.schema.DataFetchingEnvironment; import java.util.List; +import java.util.function.Supplier; @Internal public interface DataLoaderDispatchStrategy { @@ -44,7 +46,8 @@ default void executeObjectOnFieldValuesException(Throwable t, ExecutionStrategyP default void fieldFetched(ExecutionContext executionContext, ExecutionStrategyParameters executionStrategyParameters, DataFetcher dataFetcher, - Object fetchedValue) { + Object fetchedValue, + Supplier dataFetchingEnvironment) { } diff --git a/src/main/java/graphql/execution/Execution.java b/src/main/java/graphql/execution/Execution.java index 187525a1e2..f35854a188 100644 --- a/src/main/java/graphql/execution/Execution.java +++ b/src/main/java/graphql/execution/Execution.java @@ -60,6 +60,7 @@ public class Execution { private final ResponseMapFactory responseMapFactory; private final boolean doNotAutomaticallyDispatchDataLoader; + public Execution(ExecutionStrategy queryStrategy, ExecutionStrategy mutationStrategy, ExecutionStrategy subscriptionStrategy, diff --git a/src/main/java/graphql/execution/ExecutionStrategy.java b/src/main/java/graphql/execution/ExecutionStrategy.java index bec1301a4f..355f13106b 100644 --- a/src/main/java/graphql/execution/ExecutionStrategy.java +++ b/src/main/java/graphql/execution/ExecutionStrategy.java @@ -400,6 +400,7 @@ private Object fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext exec } MergedField field = parameters.getField(); + String pathString = parameters.getPath().toString(); GraphQLObjectType parentType = (GraphQLObjectType) parameters.getExecutionStepInfo().getUnwrappedNonNullType(); // if the DF (like PropertyDataFetcher) does not use the arguments or execution step info then dont build any @@ -450,7 +451,7 @@ private Object fetchField(GraphQLFieldDefinition fieldDef, ExecutionContext exec dataFetcher = instrumentation.instrumentDataFetcher(dataFetcher, instrumentationFieldFetchParams, executionContext.getInstrumentationState()); dataFetcher = executionContext.getDataLoaderDispatcherStrategy().modifyDataFetcher(dataFetcher); Object fetchedObject = invokeDataFetcher(executionContext, parameters, fieldDef, dataFetchingEnvironment, dataFetcher); - executionContext.getDataLoaderDispatcherStrategy().fieldFetched(executionContext, parameters, dataFetcher, fetchedObject); + executionContext.getDataLoaderDispatcherStrategy().fieldFetched(executionContext, parameters, dataFetcher, fetchedObject, dataFetchingEnvironment); fetchCtx.onDispatched(); fetchCtx.onFetchedValue(fetchedObject); // if it's a subscription, leave any reactive objects alone diff --git a/src/main/java/graphql/execution/ResultPath.java b/src/main/java/graphql/execution/ResultPath.java index c4441b332f..55d4984f2b 100644 --- a/src/main/java/graphql/execution/ResultPath.java +++ b/src/main/java/graphql/execution/ResultPath.java @@ -38,20 +38,36 @@ public static ResultPath rootPath() { // hash is effective immutable but lazily initialized similar to the hash code of java.lang.String private int hash; + private final String toStringValue; private ResultPath() { parent = null; segment = null; + this.toStringValue = initString(); } private ResultPath(ResultPath parent, String segment) { this.parent = assertNotNull(parent, () -> "Must provide a parent path"); this.segment = assertNotNull(segment, () -> "Must provide a sub path"); + this.toStringValue = initString(); } private ResultPath(ResultPath parent, int segment) { this.parent = assertNotNull(parent, () -> "Must provide a parent path"); this.segment = segment; + this.toStringValue = initString(); + } + + private String initString() { + if (parent == null) { + return ""; + } + + if (ROOT_PATH.equals(parent)) { + return segmentToString(); + } + return parent + segmentToString(); + } public int getLevel() { @@ -294,15 +310,7 @@ public List getKeysOnly() { */ @Override public String toString() { - if (parent == null) { - return ""; - } - - if (ROOT_PATH.equals(parent)) { - return segmentToString(); - } - - return parent.toString() + segmentToString(); + return toStringValue; } public String segmentToString() { diff --git a/src/main/java/graphql/execution/instrumentation/dataloader/DataLoaderDispatchingContextKeys.java b/src/main/java/graphql/execution/instrumentation/dataloader/DataLoaderDispatchingContextKeys.java new file mode 100644 index 0000000000..2aea2460ef --- /dev/null +++ b/src/main/java/graphql/execution/instrumentation/dataloader/DataLoaderDispatchingContextKeys.java @@ -0,0 +1,83 @@ +package graphql.execution.instrumentation.dataloader; + + +import graphql.ExperimentalApi; +import graphql.GraphQLContext; +import org.jspecify.annotations.NullMarked; + +import java.time.Duration; + +/** + * GraphQLContext keys related to DataLoader dispatching. + */ +@ExperimentalApi +@NullMarked +public final class DataLoaderDispatchingContextKeys { + private DataLoaderDispatchingContextKeys() { + } + + /** + * In nano seconds, the batch window size for delayed DataLoaders. + * That is for DataLoaders, that are not batched as part of the normal per level + * dispatching, because they were created after the level was already dispatched. + *

+ * Expect Long values + *

+ * Default is 500_000 (0.5 ms) + */ + public static final String DELAYED_DATA_LOADER_BATCH_WINDOW_SIZE_NANO_SECONDS = "__GJ_delayed_data_loader_batch_window_size_nano_seconds"; + + /** + * An instance of {@link DelayedDataLoaderDispatcherExecutorFactory} that is used to create the + * {@link java.util.concurrent.ScheduledExecutorService} for the delayed DataLoader dispatching. + *

+ * Default is one static executor thread pool with a single thread. + */ + public static final String DELAYED_DATA_LOADER_DISPATCHING_EXECUTOR_FACTORY = "__GJ_delayed_data_loader_dispatching_executor_factory"; + + + /** + * Enables the ability to chain DataLoader dispatching. + *

+ * Because this requires that all DataLoaders are accessed via DataFetchingEnvironment.getLoader() + * this is not completely backwards compatible and therefore disabled by default. + *

+ * Expects a boolean value. + */ + public static final String ENABLE_DATA_LOADER_CHAINING = "__GJ_enable_data_loader_chaining"; + + + /** + * Enables the ability that chained DataLoaders are dispatched automatically. + * + * @param graphQLContext + */ + public static void setEnableDataLoaderChaining(GraphQLContext graphQLContext, boolean enabled) { + graphQLContext.put(ENABLE_DATA_LOADER_CHAINING, enabled); + } + + + /** + * Sets nanoseconds the batch window duration size for delayed DataLoaders. + * That is for DataLoaders, that are not batched as part of the normal per level + * dispatching, because they were created after the level was already dispatched. + * + * @param graphQLContext + * @param batchWindowSize + */ + public static void setDelayedDataLoaderBatchWindowSize(GraphQLContext graphQLContext, Duration batchWindowSize) { + graphQLContext.put(DELAYED_DATA_LOADER_BATCH_WINDOW_SIZE_NANO_SECONDS, batchWindowSize.toNanos()); + } + + /** + * Sets the instance of {@link DelayedDataLoaderDispatcherExecutorFactory} that is used to create the + * {@link java.util.concurrent.ScheduledExecutorService} for the delayed DataLoader dispatching. + *

+ * + * @param graphQLContext + * @param delayedDataLoaderDispatcherExecutorFactory + */ + public static void setDelayedDataLoaderDispatchingExecutorFactory(GraphQLContext graphQLContext, DelayedDataLoaderDispatcherExecutorFactory delayedDataLoaderDispatcherExecutorFactory) { + graphQLContext.put(DELAYED_DATA_LOADER_DISPATCHING_EXECUTOR_FACTORY, delayedDataLoaderDispatcherExecutorFactory); + } +} diff --git a/src/main/java/graphql/execution/instrumentation/dataloader/DelayedDataLoaderDispatcherExecutorFactory.java b/src/main/java/graphql/execution/instrumentation/dataloader/DelayedDataLoaderDispatcherExecutorFactory.java new file mode 100644 index 0000000000..29cb86076f --- /dev/null +++ b/src/main/java/graphql/execution/instrumentation/dataloader/DelayedDataLoaderDispatcherExecutorFactory.java @@ -0,0 +1,29 @@ +package graphql.execution.instrumentation.dataloader; + +import graphql.ExperimentalApi; +import graphql.GraphQLContext; +import graphql.execution.ExecutionId; +import org.jspecify.annotations.NullMarked; + +import java.util.concurrent.ScheduledExecutorService; + +/** + * See {@link DataLoaderDispatchingContextKeys} for how to set it. + */ +@ExperimentalApi +@NullMarked +@FunctionalInterface +public interface DelayedDataLoaderDispatcherExecutorFactory { + + /** + * Called once per execution to create the {@link ScheduledExecutorService} for the delayed DataLoader dispatching. + * + * Will only called if needed, i.e. if there are delayed DataLoaders. + * + * @param executionId + * @param graphQLContext + * + * @return + */ + ScheduledExecutorService createExecutor(ExecutionId executionId, GraphQLContext graphQLContext); +} diff --git a/src/main/java/graphql/execution/instrumentation/dataloader/PerLevelDataLoaderDispatchStrategy.java b/src/main/java/graphql/execution/instrumentation/dataloader/PerLevelDataLoaderDispatchStrategy.java index 0d1903eaab..30ccd838d4 100644 --- a/src/main/java/graphql/execution/instrumentation/dataloader/PerLevelDataLoaderDispatchStrategy.java +++ b/src/main/java/graphql/execution/instrumentation/dataloader/PerLevelDataLoaderDispatchStrategy.java @@ -1,43 +1,100 @@ package graphql.execution.instrumentation.dataloader; import graphql.Assert; +import graphql.GraphQLContext; import graphql.Internal; import graphql.execution.DataLoaderDispatchStrategy; import graphql.execution.ExecutionContext; import graphql.execution.ExecutionStrategyParameters; import graphql.execution.FieldValueInfo; import graphql.schema.DataFetcher; +import graphql.schema.DataFetchingEnvironment; +import graphql.util.InterThreadMemoizedSupplier; import graphql.util.LockKit; +import org.dataloader.DataLoader; import org.dataloader.DataLoaderRegistry; +import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; +import java.util.stream.Collectors; @Internal public class PerLevelDataLoaderDispatchStrategy implements DataLoaderDispatchStrategy { private final CallStack callStack; private final ExecutionContext executionContext; + private final long batchWindowNs; + private final boolean enableDataLoaderChaining; + + private final InterThreadMemoizedSupplier delayedDataLoaderDispatchExecutor; + + static final InterThreadMemoizedSupplier defaultDelayedDLCFBatchWindowScheduler + = new InterThreadMemoizedSupplier<>(() -> Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors())); + + static final long DEFAULT_BATCH_WINDOW_NANO_SECONDS_DEFAULT = 500_000L; private static class CallStack { private final LockKit.ReentrantLock lock = new LockKit.ReentrantLock(); + + /** + * A level is ready when all fields in this level are fetched + * The expected field fetch count is accurate when all execute object calls happened + * The expected execute object count is accurate when all sub selections fetched + * are done in the previous level + */ + private final LevelMap expectedFetchCountPerLevel = new LevelMap(); private final LevelMap fetchCountPerLevel = new LevelMap(); + // an object call means a sub selection of a field of type object/interface/union + // the number of fields for sub selections increases the expected fetch count for this level private final LevelMap expectedExecuteObjectCallsPerLevel = new LevelMap(); private final LevelMap happenedExecuteObjectCallsPerLevel = new LevelMap(); + // this means one sub selection has been fully fetched + // and the expected execute objects calls for the next level have been calculated private final LevelMap happenedOnFieldValueCallsPerLevel = new LevelMap(); - private final Set dispatchedLevels = new LinkedHashSet<>(); + private final Set dispatchedLevels = ConcurrentHashMap.newKeySet(); + + // all levels that are ready to be dispatched + private int highestReadyLevel; + + private final List allResultPathWithDataLoader = Collections.synchronizedList(new ArrayList<>()); + private final Map> levelToResultPathWithDataLoader = new ConcurrentHashMap<>(); + + private final Set dispatchingStartedPerLevel = ConcurrentHashMap.newKeySet(); + private final Set dispatchingFinishedPerLevel = ConcurrentHashMap.newKeySet(); + // Set of ResultPath + private final Set batchWindowOfDelayedDataLoaderToDispatch = ConcurrentHashMap.newKeySet(); + + private boolean batchWindowOpen; + public CallStack() { + // in the first level there is only one sub selection, + // so we only expect one execute object call (which is actually an executionStrategy call) expectedExecuteObjectCallsPerLevel.set(1, 1); } + public void addResultPathWithDataLoader(int level, ResultPathWithDataLoader resultPathWithDataLoader) { + levelToResultPathWithDataLoader.computeIfAbsent(level, k -> new LinkedHashSet<>()).add(resultPathWithDataLoader); + } + + void increaseExpectedFetchCount(int level, int count) { expectedFetchCountPerLevel.increment(level, count); } @@ -82,7 +139,7 @@ boolean allExecuteObjectCallsHappened(int level) { return happenedExecuteObjectCallsPerLevel.get(level) == expectedExecuteObjectCallsPerLevel.get(level); } - boolean allOnFieldCallsHappened(int level) { + boolean allSubSelectionsFetchingHappened(int level) { return happenedOnFieldValueCallsPerLevel.get(level) == expectedExecuteObjectCallsPerLevel.get(level); } @@ -107,19 +164,29 @@ public String toString() { } - public boolean dispatchIfNotDispatchedBefore(int level) { - if (dispatchedLevels.contains(level)) { + public void setDispatchedLevel(int level) { + if (!dispatchedLevels.add(level)) { Assert.assertShouldNeverHappen("level " + level + " already dispatched"); - return false; } - dispatchedLevels.add(level); - return true; } } public PerLevelDataLoaderDispatchStrategy(ExecutionContext executionContext) { this.callStack = new CallStack(); this.executionContext = executionContext; + + GraphQLContext graphQLContext = executionContext.getGraphQLContext(); + this.batchWindowNs = graphQLContext.getOrDefault(DataLoaderDispatchingContextKeys.DELAYED_DATA_LOADER_BATCH_WINDOW_SIZE_NANO_SECONDS, DEFAULT_BATCH_WINDOW_NANO_SECONDS_DEFAULT); + + this.delayedDataLoaderDispatchExecutor = new InterThreadMemoizedSupplier<>(() -> { + DelayedDataLoaderDispatcherExecutorFactory delayedDataLoaderDispatcherExecutorFactory = graphQLContext.get(DataLoaderDispatchingContextKeys.DELAYED_DATA_LOADER_DISPATCHING_EXECUTOR_FACTORY); + if (delayedDataLoaderDispatcherExecutorFactory != null) { + return delayedDataLoaderDispatcherExecutorFactory.createExecutor(executionContext.getExecutionId(), graphQLContext); + } + return defaultDelayedDLCFBatchWindowScheduler.get(); + }); + + this.enableDataLoaderChaining = graphQLContext.getBoolean(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING, false); } @Override @@ -129,8 +196,8 @@ public void executeDeferredOnFieldValueInfo(FieldValueInfo fieldValueInfo, Execu @Override public void executionStrategy(ExecutionContext executionContext, ExecutionStrategyParameters parameters) { - int curLevel = parameters.getExecutionStepInfo().getPath().getLevel() + 1; - increaseHappenedExecuteObjectAndIncreaseExpectedFetchCount(curLevel, parameters); + Assert.assertTrue(parameters.getExecutionStepInfo().getPath().isRootPath()); + increaseHappenedExecuteObjectAndIncreaseExpectedFetchCount(1, parameters); } @Override @@ -192,26 +259,44 @@ private void resetCallStack() { callStack.clearHappenedExecuteObjectCalls(); callStack.clearHappenedOnFieldValueCalls(); callStack.expectedExecuteObjectCallsPerLevel.set(1, 1); + callStack.dispatchingFinishedPerLevel.clear(); + callStack.dispatchingStartedPerLevel.clear(); + callStack.allResultPathWithDataLoader.clear(); + callStack.batchWindowOfDelayedDataLoaderToDispatch.clear(); + callStack.batchWindowOpen = false; + callStack.levelToResultPathWithDataLoader.clear(); + callStack.highestReadyLevel = 0; }); } private void onFieldValuesInfoDispatchIfNeeded(List fieldValueInfoList, int curLevel) { - boolean dispatchNeeded = callStack.lock.callLocked(() -> + Integer dispatchLevel = callStack.lock.callLocked(() -> handleOnFieldValuesInfo(fieldValueInfoList, curLevel) ); - if (dispatchNeeded) { - dispatch(curLevel); + // the handle on field values check for the next level if it is ready + if (dispatchLevel != null) { + dispatch(dispatchLevel); } } // // thread safety: called with callStack.lock // - private boolean handleOnFieldValuesInfo(List fieldValueInfos, int curLevel) { + private Integer handleOnFieldValuesInfo(List fieldValueInfos, int curLevel) { callStack.increaseHappenedOnFieldValueCalls(curLevel); int expectedOnObjectCalls = getObjectCountForList(fieldValueInfos); + // on the next level we expect the following on object calls because we found non null objects callStack.increaseExpectedExecuteObjectCalls(curLevel + 1, expectedOnObjectCalls); - return dispatchIfNeeded(curLevel + 1); + // maybe the object calls happened already (because the DataFetcher return directly values synchronously) + // therefore we check the next levels if they are ready + // this means we could skip some level because the higher level is also already ready, + // which means there is nothing to dispatch on these levels: if x and x+1 is ready, it means there are no + // data loaders used on x + // + // if data loader chaining is disabled (the old algo) the level we dispatch is not really relevant as + // we dispatch the whole registry anyway + + return getHighestReadyLevel(curLevel + 1); } /** @@ -234,7 +319,8 @@ private int getObjectCountForList(List fieldValueInfos) { public void fieldFetched(ExecutionContext executionContext, ExecutionStrategyParameters executionStrategyParameters, DataFetcher dataFetcher, - Object fetchedValue) { + Object fetchedValue, + Supplier dataFetchingEnvironment) { int level = executionStrategyParameters.getPath().getLevel(); boolean dispatchNeeded = callStack.lock.callLocked(() -> { callStack.increaseFetchCount(level); @@ -251,9 +337,10 @@ public void fieldFetched(ExecutionContext executionContext, // thread safety : called with callStack.lock // private boolean dispatchIfNeeded(int level) { - boolean ready = levelReady(level); + boolean ready = checkLevelBeingReady(level); if (ready) { - return callStack.dispatchIfNotDispatchedBefore(level); + callStack.setDispatchedLevel(level); + return true; } return false; } @@ -261,22 +348,179 @@ private boolean dispatchIfNeeded(int level) { // // thread safety: called with callStack.lock // - private boolean levelReady(int level) { - if (level == 1) { - // level 1 is special: there is only one strategy call and that's it - return callStack.allFetchesHappened(1); + private Integer getHighestReadyLevel(int startFrom) { + int curLevel = callStack.highestReadyLevel; + while (true) { + if (!checkLevelImpl(curLevel + 1)) { + callStack.highestReadyLevel = curLevel; + return curLevel >= startFrom ? curLevel : null; + } + curLevel++; } - if (levelReady(level - 1) && callStack.allOnFieldCallsHappened(level - 1) - && callStack.allExecuteObjectCallsHappened(level) && callStack.allFetchesHappened(level)) { + } + private boolean checkLevelBeingReady(int level) { + Assert.assertTrue(level > 0); + if (level <= callStack.highestReadyLevel) { return true; } - return false; + + for (int i = callStack.highestReadyLevel + 1; i <= level; i++) { + if (!checkLevelImpl(i)) { + return false; + } + } + callStack.highestReadyLevel = level; + return true; + } + + private boolean checkLevelImpl(int level) { + // a level with zero expectations can't be ready + if (callStack.expectedFetchCountPerLevel.get(level) == 0) { + return false; + } + // level 1 is special: there is no previous sub selections + // and the expected execution object calls is always 1 + if (level > 1 && !callStack.allSubSelectionsFetchingHappened(level - 1)) { + return false; + } + if (!callStack.allExecuteObjectCallsHappened(level)) { + return false; + } + if (!callStack.allFetchesHappened(level)) { + return false; + } + return true; } void dispatch(int level) { - DataLoaderRegistry dataLoaderRegistry = executionContext.getDataLoaderRegistry(); - dataLoaderRegistry.dispatchAll(); + if (!enableDataLoaderChaining) { + DataLoaderRegistry dataLoaderRegistry = executionContext.getDataLoaderRegistry(); + dataLoaderRegistry.dispatchAll(); + return; + } + + Set resultPathWithDataLoaders = callStack.levelToResultPathWithDataLoader.get(level); + if (resultPathWithDataLoaders != null) { + Set resultPathToDispatch = callStack.lock.callLocked(() -> { + callStack.dispatchingStartedPerLevel.add(level); + return resultPathWithDataLoaders + .stream() + .map(resultPathWithDataLoader -> resultPathWithDataLoader.resultPath) + .collect(Collectors.toSet()); + }); + dispatchDLCFImpl(resultPathToDispatch, level); + } else { + callStack.lock.runLocked(() -> { + callStack.dispatchingStartedPerLevel.add(level); + callStack.dispatchingFinishedPerLevel.add(level); + }); + } + } + + + public void dispatchDLCFImpl(Set resultPathsToDispatch, Integer level) { + + // filter out all DataLoaderCFS that are matching the fields we want to dispatch + List relevantResultPathWithDataLoader = new ArrayList<>(); + for (ResultPathWithDataLoader resultPathWithDataLoader : callStack.allResultPathWithDataLoader) { + if (resultPathsToDispatch.contains(resultPathWithDataLoader.resultPath)) { + relevantResultPathWithDataLoader.add(resultPathWithDataLoader); + } + } + // we are cleaning up the list of all DataLoadersCFs + callStack.allResultPathWithDataLoader.removeAll(relevantResultPathWithDataLoader); + + // means we are all done dispatching the fields + if (relevantResultPathWithDataLoader.size() == 0) { + if (level != null) { + callStack.dispatchingFinishedPerLevel.add(level); + } + return; + } + List allDispatchedCFs = new ArrayList<>(); + for (ResultPathWithDataLoader resultPathWithDataLoader : relevantResultPathWithDataLoader) { + allDispatchedCFs.add(resultPathWithDataLoader.dataLoader.dispatch()); + } + CompletableFuture.allOf(allDispatchedCFs.toArray(new CompletableFuture[0])) + .whenComplete((unused, throwable) -> { + dispatchDLCFImpl(resultPathsToDispatch, level); + } + ); + + } + + + public void newDataLoaderLoadCall(String resultPath, int level, DataLoader dataLoader, String dataLoaderName, Object key) { + if (!enableDataLoaderChaining) { + return; + } + ResultPathWithDataLoader resultPathWithDataLoader = new ResultPathWithDataLoader(resultPath, level, dataLoader, dataLoaderName, key); + boolean levelFinished = callStack.lock.callLocked(() -> { + boolean finished = callStack.dispatchingFinishedPerLevel.contains(level); + callStack.allResultPathWithDataLoader.add(resultPathWithDataLoader); + // only add to the list of DataLoader for this level if we are not already dispatching + if (!callStack.dispatchingStartedPerLevel.contains(level)) { + callStack.addResultPathWithDataLoader(level, resultPathWithDataLoader); + } + return finished; + }); + if (levelFinished) { + newDelayedDataLoader(resultPathWithDataLoader); + } + + + } + + class DispatchDelayedDataloader implements Runnable { + + @Override + public void run() { + AtomicReference> resultPathToDispatch = new AtomicReference<>(); + callStack.lock.runLocked(() -> { + resultPathToDispatch.set(new LinkedHashSet<>(callStack.batchWindowOfDelayedDataLoaderToDispatch)); + callStack.batchWindowOfDelayedDataLoaderToDispatch.clear(); + callStack.batchWindowOpen = false; + }); + dispatchDLCFImpl(resultPathToDispatch.get(), null); + } + } + + private void newDelayedDataLoader(ResultPathWithDataLoader resultPathWithDataLoader) { + callStack.lock.runLocked(() -> { + callStack.batchWindowOfDelayedDataLoaderToDispatch.add(resultPathWithDataLoader.resultPath); + if (!callStack.batchWindowOpen) { + callStack.batchWindowOpen = true; + delayedDataLoaderDispatchExecutor.get().schedule(new DispatchDelayedDataloader(), this.batchWindowNs, TimeUnit.NANOSECONDS); + } + + }); + } + + private static class ResultPathWithDataLoader { + final String resultPath; + final int level; + final DataLoader dataLoader; + final String name; + final Object key; + + public ResultPathWithDataLoader(String resultPath, int level, DataLoader dataLoader, String name, Object key) { + this.resultPath = resultPath; + this.level = level; + this.dataLoader = dataLoader; + this.name = name; + this.key = key; + } + + @Override + public String toString() { + return "ResultPathWithDataLoader{" + + "resultPath='" + resultPath + '\'' + + ", level=" + level + + ", key=" + key + + ", name='" + name + '\'' + + '}'; + } } } diff --git a/src/main/java/graphql/execution/instrumentation/dataloader/PerLevelDataLoaderDispatchStrategyWithDeferAlwaysDispatch.java b/src/main/java/graphql/execution/instrumentation/dataloader/PerLevelDataLoaderDispatchStrategyWithDeferAlwaysDispatch.java index 1a9ec7c826..7f996f664b 100644 --- a/src/main/java/graphql/execution/instrumentation/dataloader/PerLevelDataLoaderDispatchStrategyWithDeferAlwaysDispatch.java +++ b/src/main/java/graphql/execution/instrumentation/dataloader/PerLevelDataLoaderDispatchStrategyWithDeferAlwaysDispatch.java @@ -8,6 +8,7 @@ import graphql.execution.FieldValueInfo; import graphql.execution.MergedField; import graphql.schema.DataFetcher; +import graphql.schema.DataFetchingEnvironment; import graphql.util.LockKit; import org.dataloader.DataLoaderRegistry; @@ -15,6 +16,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Supplier; /** * The execution of a query can be divided into 2 phases: first, the non-deferred fields are executed and only once @@ -174,7 +176,8 @@ public void executeObjectOnFieldValuesException(Throwable t, ExecutionStrategyPa public void fieldFetched(ExecutionContext executionContext, ExecutionStrategyParameters parameters, DataFetcher dataFetcher, - Object fetchedValue) { + Object fetchedValue, + Supplier dataFetchingEnvironment) { final boolean dispatchNeeded; diff --git a/src/main/java/graphql/schema/DataFetchingEnvironment.java b/src/main/java/graphql/schema/DataFetchingEnvironment.java index cc38ec0cc1..40cfda4386 100644 --- a/src/main/java/graphql/schema/DataFetchingEnvironment.java +++ b/src/main/java/graphql/schema/DataFetchingEnvironment.java @@ -1,6 +1,7 @@ package graphql.schema; import graphql.GraphQLContext; +import graphql.Internal; import graphql.PublicApi; import graphql.execution.ExecutionId; import graphql.execution.ExecutionStepInfo; @@ -237,6 +238,7 @@ public interface DataFetchingEnvironment extends IntrospectionDataFetchingEnviro @Nullable DataLoader getDataLoader(String dataLoaderName); + /** * @return the {@link org.dataloader.DataLoaderRegistry} in play */ @@ -270,4 +272,17 @@ public interface DataFetchingEnvironment extends IntrospectionDataFetchingEnviro * @return the coerced variables that have been passed to the query that is being executed */ Map getVariables(); + + + /** + * A method that should only be used by the GraphQL Java library itself. + * It is not intended for public use. + * + * @return an internal representation of the DataFetchingEnvironment + */ + @Internal + default Object toInternal() { + throw new UnsupportedOperationException(); + } + } diff --git a/src/main/java/graphql/schema/DataFetchingEnvironmentImpl.java b/src/main/java/graphql/schema/DataFetchingEnvironmentImpl.java index 356988055f..0dd0e30674 100644 --- a/src/main/java/graphql/schema/DataFetchingEnvironmentImpl.java +++ b/src/main/java/graphql/schema/DataFetchingEnvironmentImpl.java @@ -6,6 +6,7 @@ import graphql.Internal; import graphql.collect.ImmutableKit; import graphql.collect.ImmutableMapWithNullValues; +import graphql.execution.DataLoaderDispatchStrategy; import graphql.execution.ExecutionContext; import graphql.execution.ExecutionId; import graphql.execution.ExecutionStepInfo; @@ -50,6 +51,9 @@ public class DataFetchingEnvironmentImpl implements DataFetchingEnvironment { private final ImmutableMapWithNullValues variables; private final QueryDirectives queryDirectives; + // used for internal() method + private final DFEInternalState dfeInternalState; + private DataFetchingEnvironmentImpl(Builder builder) { this.source = builder.source; this.arguments = builder.arguments == null ? ImmutableKit::emptyMap : builder.arguments; @@ -72,6 +76,9 @@ private DataFetchingEnvironmentImpl(Builder builder) { this.document = builder.document; this.variables = builder.variables == null ? ImmutableMapWithNullValues.emptyMap() : builder.variables; this.queryDirectives = builder.queryDirectives; + + // internal state + this.dfeInternalState = new DFEInternalState(builder.dataLoaderDispatchStrategy); } /** @@ -97,7 +104,9 @@ public static Builder newDataFetchingEnvironment(ExecutionContext executionConte .document(executionContext.getDocument()) .operationDefinition(executionContext.getOperationDefinition()) .variables(executionContext.getCoercedVariables().toMap()) - .executionId(executionContext.getExecutionId()); + .executionId(executionContext.getExecutionId()) + .dataLoaderDispatchStrategy(executionContext.getDataLoaderDispatcherStrategy()); + } @Override @@ -205,9 +214,10 @@ public ExecutionStepInfo getExecutionStepInfo() { return executionStepInfo.get(); } + @Override public @Nullable DataLoader getDataLoader(String dataLoaderName) { - return dataLoaderRegistry.getDataLoader(dataLoaderName); + return new DataLoaderWithContext<>(this, dataLoaderName, dataLoaderRegistry.getDataLoader(dataLoaderName)); } @Override @@ -235,6 +245,12 @@ public Map getVariables() { return variables; } + + @Override + public Object toInternal() { + return this.dfeInternalState; + } + @Override public String toString() { return "DataFetchingEnvironmentImpl{" + @@ -265,6 +281,7 @@ public static class Builder { private ImmutableMap fragmentsByName; private ImmutableMapWithNullValues variables; private QueryDirectives queryDirectives; + private DataLoaderDispatchStrategy dataLoaderDispatchStrategy; public Builder(DataFetchingEnvironmentImpl env) { this.source = env.source; @@ -288,6 +305,7 @@ public Builder(DataFetchingEnvironmentImpl env) { this.document = env.document; this.variables = env.variables; this.queryDirectives = env.queryDirectives; + this.dataLoaderDispatchStrategy = env.dfeInternalState.dataLoaderDispatchStrategy; } public Builder() { @@ -410,5 +428,23 @@ public Builder queryDirectives(QueryDirectives queryDirectives) { public DataFetchingEnvironment build() { return new DataFetchingEnvironmentImpl(this); } + + public Builder dataLoaderDispatchStrategy(DataLoaderDispatchStrategy dataLoaderDispatcherStrategy) { + this.dataLoaderDispatchStrategy = dataLoaderDispatcherStrategy; + return this; + } + } + + @Internal + public static class DFEInternalState { + final DataLoaderDispatchStrategy dataLoaderDispatchStrategy; + + public DFEInternalState(DataLoaderDispatchStrategy dataLoaderDispatchStrategy) { + this.dataLoaderDispatchStrategy = dataLoaderDispatchStrategy; + } + + public DataLoaderDispatchStrategy getDataLoaderDispatchStrategy() { + return dataLoaderDispatchStrategy; + } } } diff --git a/src/main/java/graphql/schema/DataLoaderWithContext.java b/src/main/java/graphql/schema/DataLoaderWithContext.java new file mode 100644 index 0000000000..a4b56814ca --- /dev/null +++ b/src/main/java/graphql/schema/DataLoaderWithContext.java @@ -0,0 +1,40 @@ +package graphql.schema; + +import graphql.Internal; +import graphql.execution.instrumentation.dataloader.PerLevelDataLoaderDispatchStrategy; +import org.dataloader.DataLoader; +import org.dataloader.DelegatingDataLoader; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +@Internal +@NullMarked +public class DataLoaderWithContext extends DelegatingDataLoader { + final DataFetchingEnvironment dfe; + final String dataLoaderName; + + public DataLoaderWithContext(DataFetchingEnvironment dfe, String dataLoaderName, DataLoader delegate) { + super(delegate); + this.dataLoaderName = dataLoaderName; + this.dfe = dfe; + } + + @Override + public CompletableFuture load(@NonNull K key, @Nullable Object keyContext) { + // calling super.load() is important, because otherwise the data loader will sometimes called + // later than the dispatch, which results in a hanging DL + CompletableFuture result = super.load(key, keyContext); + DataFetchingEnvironmentImpl dfeImpl = (DataFetchingEnvironmentImpl) dfe; + int level = dfe.getExecutionStepInfo().getPath().getLevel(); + String path = dfe.getExecutionStepInfo().getPath().toString(); + DataFetchingEnvironmentImpl.DFEInternalState dfeInternalState = (DataFetchingEnvironmentImpl.DFEInternalState) dfeImpl.toInternal(); + if (dfeInternalState.getDataLoaderDispatchStrategy() instanceof PerLevelDataLoaderDispatchStrategy) { + ((PerLevelDataLoaderDispatchStrategy) dfeInternalState.dataLoaderDispatchStrategy).newDataLoaderLoadCall(path, level, delegate, dataLoaderName, key); + } + return result; + } + +} diff --git a/src/main/java/graphql/schema/DelegatingDataFetchingEnvironment.java b/src/main/java/graphql/schema/DelegatingDataFetchingEnvironment.java index b39d8a40b0..811e9949c1 100644 --- a/src/main/java/graphql/schema/DelegatingDataFetchingEnvironment.java +++ b/src/main/java/graphql/schema/DelegatingDataFetchingEnvironment.java @@ -176,4 +176,9 @@ public Document getDocument() { public Map getVariables() { return delegateEnvironment.getVariables(); } + + @Override + public Object toInternal() { + return delegateEnvironment.toInternal(); + } } diff --git a/src/test/groovy/graphql/ChainedDataLoaderTest.groovy b/src/test/groovy/graphql/ChainedDataLoaderTest.groovy new file mode 100644 index 0000000000..391f184a73 --- /dev/null +++ b/src/test/groovy/graphql/ChainedDataLoaderTest.groovy @@ -0,0 +1,529 @@ +package graphql + +import graphql.execution.ExecutionId +import graphql.execution.instrumentation.dataloader.DataLoaderDispatchingContextKeys +import graphql.execution.instrumentation.dataloader.DelayedDataLoaderDispatcherExecutorFactory +import graphql.schema.DataFetcher +import org.awaitility.Awaitility +import org.dataloader.BatchLoader +import org.dataloader.DataLoader +import org.dataloader.DataLoaderFactory +import org.dataloader.DataLoaderRegistry +import spock.lang.Specification +import spock.lang.Unroll + +import java.time.Duration +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicInteger + +import static graphql.ExecutionInput.newExecutionInput +import static graphql.execution.instrumentation.dataloader.DataLoaderDispatchingContextKeys.setEnableDataLoaderChaining +import static java.util.concurrent.CompletableFuture.supplyAsync + +class ChainedDataLoaderTest extends Specification { + + + def "chained data loaders"() { + given: + def sdl = ''' + + type Query { + dogName: String + catName: String + } + ''' + int batchLoadCalls = 0 + BatchLoader batchLoader = { keys -> + return supplyAsync { + batchLoadCalls++ + Thread.sleep(250) + println "BatchLoader called with keys: $keys" + assert keys.size() == 2 + return ["Luna", "Tiger"] + } + } + + DataLoader nameDataLoader = DataLoaderFactory.newDataLoader(batchLoader); + + DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry(); + dataLoaderRegistry.register("name", nameDataLoader); + + def df1 = { env -> + return env.getDataLoader("name").load("Key1").thenCompose { + result -> + { + return env.getDataLoader("name").load(result) + } + } + } as DataFetcher + + def df2 = { env -> + return env.getDataLoader("name").load("Key2").thenCompose { + result -> + { + return env.getDataLoader("name").load(result) + } + } + } as DataFetcher + + + def fetchers = ["Query": ["dogName": df1, "catName": df2]] + def schema = TestUtil.schema(sdl, fetchers) + def graphQL = GraphQL.newGraphQL(schema).build() + + def query = "{ dogName catName } " + def ei = newExecutionInput(query).dataLoaderRegistry(dataLoaderRegistry).build() + setEnableDataLoaderChaining(ei.graphQLContext, true) + + when: + def efCF = graphQL.executeAsync(ei) + Awaitility.await().until { efCF.isDone() } + def er = efCF.get() + then: + er.data == [dogName: "Luna", catName: "Tiger"] + batchLoadCalls == 2 + } + + @Unroll + def "parallel different data loaders"() { + given: + def sdl = ''' + + type Query { + hello: String + helloDelayed: String + } + ''' + AtomicInteger batchLoadCalls = new AtomicInteger() + BatchLoader batchLoader1 = { keys -> + println "BatchLoader 1 called with keys: $keys ${Thread.currentThread().name}" + batchLoadCalls.incrementAndGet() + return supplyAsync { + Thread.sleep(250) + assert keys.size() == 1 + return ["Luna" + keys[0]] + } + } + + BatchLoader batchLoader2 = { keys -> + println "BatchLoader 2 called with keys: $keys ${Thread.currentThread().name}" + batchLoadCalls.incrementAndGet() + return supplyAsync { + Thread.sleep(250) + assert keys.size() == 1 + return ["Skipper" + keys[0]] + } + } + BatchLoader batchLoader3 = { keys -> + println "BatchLoader 3 called with keys: $keys ${Thread.currentThread().name}" + batchLoadCalls.incrementAndGet() + return supplyAsync { + Thread.sleep(250) + assert keys.size() == 1 + return ["friends" + keys[0]] + } + } + + + DataLoader dl1 = DataLoaderFactory.newDataLoader(batchLoader1); + DataLoader dl2 = DataLoaderFactory.newDataLoader(batchLoader2); + DataLoader dl3 = DataLoaderFactory.newDataLoader(batchLoader3); + + DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry(); + dataLoaderRegistry.register("dl1", dl1); + dataLoaderRegistry.register("dl2", dl2); + dataLoaderRegistry.register("dl3", dl3); + + def df = { env -> + def cf1 = env.getDataLoader("dl1").load("key1") + def cf2 = env.getDataLoader("dl2").load("key2") + return cf1.thenCombine(cf2, { result1, result2 -> + return result1 + result2 + }).thenCompose { + return env.getDataLoader("dl3").load(it) + } + } as DataFetcher + + def dfDelayed = { env -> + return supplyAsync { + Thread.sleep(2000) + }.thenCompose { + def cf1 = env.getDataLoader("dl1").load("key1-delayed") + def cf2 = env.getDataLoader("dl2").load("key2-delayed") + return cf1.thenCombine(cf2, { result1, result2 -> + return result1 + result2 + }).thenCompose { + return env.getDataLoader("dl3").load(it) + } + } + } as DataFetcher + + + def fetchers = [Query: [hello: df, helloDelayed: dfDelayed]] + def schema = TestUtil.schema(sdl, fetchers) + def graphQL = GraphQL.newGraphQL(schema).build() + + def query = "{ hello helloDelayed} " + def ei = newExecutionInput(query).dataLoaderRegistry(dataLoaderRegistry).build() + setEnableDataLoaderChaining(ei.graphQLContext, true) + + when: + def efCF = graphQL.executeAsync(ei) + Awaitility.await().until { efCF.isDone() } + def er = efCF.get() + then: + er.data == [hello: "friendsLunakey1Skipperkey2", helloDelayed: "friendsLunakey1-delayedSkipperkey2-delayed"] + batchLoadCalls.get() == 6 + + where: + i << (0..20) + } + + + def "more complicated chained data loader for one DF"() { + given: + def sdl = ''' + + type Query { + foo: String + } + ''' + int batchLoadCalls1 = 0 + BatchLoader batchLoader1 = { keys -> + return supplyAsync { + batchLoadCalls1++ + Thread.sleep(250) + println "BatchLoader1 called with keys: $keys" + return keys.collect { String key -> + key + "-batchloader1" + } + } + } + int batchLoadCalls2 = 0 + BatchLoader batchLoader2 = { keys -> + return supplyAsync { + batchLoadCalls2++ + Thread.sleep(250) + println "BatchLoader2 called with keys: $keys" + return keys.collect { String key -> + key + "-batchloader2" + } + } + } + + + DataLoader dl1 = DataLoaderFactory.newDataLoader(batchLoader1); + DataLoader dl2 = DataLoaderFactory.newDataLoader(batchLoader2); + + DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry(); + dataLoaderRegistry.register("dl1", dl1); + dataLoaderRegistry.register("dl2", dl2); + + def df = { env -> + return env.getDataLoader("dl1").load("start").thenCompose { + firstDLResult -> + + def otherCF1 = supplyAsync { + Thread.sleep(1000) + return "otherCF1" + } + def otherCF2 = supplyAsync { + Thread.sleep(1000) + return "otherCF2" + } + + def secondDL = env.getDataLoader("dl2").load(firstDLResult).thenApply { + secondDLResult -> + return secondDLResult + "-apply" + } + return otherCF1.thenCompose { + otherCF1Result -> + otherCF2.thenCompose { + otherCF2Result -> + secondDL.thenApply { + secondDLResult -> + return firstDLResult + "-" + otherCF1Result + "-" + otherCF2Result + "-" + secondDLResult + } + } + } + + } + } as DataFetcher + + + def fetchers = ["Query": ["foo": df]] + def schema = TestUtil.schema(sdl, fetchers) + def graphQL = GraphQL.newGraphQL(schema).build() + + def query = "{ foo } " + def ei = newExecutionInput(query).dataLoaderRegistry(dataLoaderRegistry).build() + setEnableDataLoaderChaining(ei.graphQLContext, true) + + when: + def efCF = graphQL.executeAsync(ei) + Awaitility.await().until { efCF.isDone() } + def er = efCF.get() + then: + er.data == [foo: "start-batchloader1-otherCF1-otherCF2-start-batchloader1-batchloader2-apply"] + batchLoadCalls1 == 1 + batchLoadCalls2 == 1 + } + + + def "chained data loaders with an isolated data loader"() { + given: + def sdl = ''' + + type Query { + dogName: String + catName: String + } + ''' + int batchLoadCalls = 0 + BatchLoader batchLoader = { keys -> + return supplyAsync { + batchLoadCalls++ + Thread.sleep(250) + println "BatchLoader called with keys: $keys" + return keys.collect { String key -> + key.substring(0, key.length() - 1) + (Integer.parseInt(key.substring(key.length() - 1, key.length())) + 1) + } + } + } + + DataLoader nameDataLoader = DataLoaderFactory.newDataLoader(batchLoader); + + DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry(); + dataLoaderRegistry.register("name", nameDataLoader); + + def df1 = { env -> + return env.getDataLoader("name").load("Luna0").thenCompose { + result -> + { + return supplyAsync { + Thread.sleep(1000) + return "foo" + }.thenCompose { + return env.getDataLoader("name").load(result) + } + } + } + } as DataFetcher + + def df2 = { env -> + return env.getDataLoader("name").load("Tiger0").thenCompose { + result -> + { + return env.getDataLoader("name").load(result) + } + } + } as DataFetcher + + + def fetchers = ["Query": ["dogName": df1, "catName": df2]] + def schema = TestUtil.schema(sdl, fetchers) + def graphQL = GraphQL.newGraphQL(schema).build() + + def query = "{ dogName catName } " + def ei = newExecutionInput(query).dataLoaderRegistry(dataLoaderRegistry).build() + setEnableDataLoaderChaining(ei.graphQLContext, true) + + when: + def efCF = graphQL.executeAsync(ei) + Awaitility.await().until { efCF.isDone() } + def er = efCF.get() + then: + er.data == [dogName: "Luna2", catName: "Tiger2"] + batchLoadCalls == 3 + } + + def "chained data loaders with two isolated data loaders"() { + given: + def sdl = ''' + + type Query { + foo: String + bar: String + } + ''' + AtomicInteger batchLoadCalls = new AtomicInteger() + BatchLoader batchLoader = { keys -> + return supplyAsync { + batchLoadCalls.incrementAndGet() + Thread.sleep(250) + println "BatchLoader called with keys: $keys" + return keys; + } + } + + DataLoader nameDataLoader = DataLoaderFactory.newDataLoader(batchLoader); + + DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry(); + dataLoaderRegistry.register("dl", nameDataLoader); + + def fooDF = { env -> + return supplyAsync { + Thread.sleep(1000) + return "fooFirstValue" + }.thenCompose { + return env.getDataLoader("dl").load(it) + } + } as DataFetcher + + def barDF = { env -> + return supplyAsync { + Thread.sleep(1000) + return "barFirstValue" + }.thenCompose { + return env.getDataLoader("dl").load(it) + } + } as DataFetcher + + + def fetchers = ["Query": ["foo": fooDF, "bar": barDF]] + def schema = TestUtil.schema(sdl, fetchers) + def graphQL = GraphQL.newGraphQL(schema).build() + + def query = "{ foo bar } " + + def eiBuilder = ExecutionInput.newExecutionInput(query) + def ei = eiBuilder.dataLoaderRegistry(dataLoaderRegistry).build() + setEnableDataLoaderChaining(ei.graphQLContext, true); + + // make the window 250ms + DataLoaderDispatchingContextKeys.setDelayedDataLoaderBatchWindowSize(ei.graphQLContext, Duration.ofMillis(250)) + + when: + def efCF = graphQL.executeAsync(ei) + Awaitility.await().until { efCF.isDone() } + def er = efCF.get() + then: + er.data == [foo: "fooFirstValue", bar: "barFirstValue"] + batchLoadCalls.get() == 1 + } + + def "executor for delayed dispatching can be configured"() { + given: + def sdl = ''' + + type Query { + foo: String + bar: String + } + ''' + BatchLoader batchLoader = { keys -> + return supplyAsync { + Thread.sleep(250) + return keys; + } + } + + DataLoader nameDataLoader = DataLoaderFactory.newDataLoader(batchLoader); + + DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry(); + dataLoaderRegistry.register("dl", nameDataLoader); + + def fooDF = { env -> + return supplyAsync { + Thread.sleep(1000) + return "fooFirstValue" + }.thenCompose { + return env.getDataLoader("dl").load(it) + } + } as DataFetcher + + + def fetchers = ["Query": ["foo": fooDF]] + def schema = TestUtil.schema(sdl, fetchers) + def graphQL = GraphQL.newGraphQL(schema).build() + + def query = "{ foo } " + def ei = newExecutionInput(query).dataLoaderRegistry(dataLoaderRegistry).build() + setEnableDataLoaderChaining(ei.graphQLContext, true); + + + ScheduledExecutorService scheduledExecutorService = Mock() + DataLoaderDispatchingContextKeys.setDelayedDataLoaderDispatchingExecutorFactory(ei.getGraphQLContext(), new DelayedDataLoaderDispatcherExecutorFactory() { + @Override + ScheduledExecutorService createExecutor(ExecutionId executionId, GraphQLContext graphQLContext) { + return scheduledExecutorService + } + }) + + + when: + def efCF = graphQL.executeAsync(ei) + Awaitility.await().until { efCF.isDone() } + def er = efCF.get() + + then: + er.data == [foo: "fooFirstValue"] + 1 * scheduledExecutorService.schedule(_ as Runnable, _ as Long, _ as TimeUnit) >> { Runnable runnable, Long delay, TimeUnit timeUnit -> + return Executors.newSingleThreadScheduledExecutor().schedule(runnable, delay, timeUnit) + } + + } + + def "handling of chained DataLoaders is disabled by default"() { + given: + def sdl = ''' + + type Query { + dogName: String + catName: String + } + ''' + int batchLoadCalls = 0 + BatchLoader batchLoader = { keys -> + return supplyAsync { + batchLoadCalls++ + println "BatchLoader called with keys: $keys" + assert keys.size() == 2 + return ["Luna", "Tiger"] + } + } + + DataLoader nameDataLoader = DataLoaderFactory.newDataLoader(batchLoader); + + DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry(); + dataLoaderRegistry.register("name", nameDataLoader); + + def df1 = { env -> + return env.getDataLoader("name").load("Key1").thenCompose { + result -> + { + return env.getDataLoader("name").load(result) + } + } + } as DataFetcher + + def df2 = { env -> + return env.getDataLoader("name").load("Key2").thenCompose { + result -> + { + return env.getDataLoader("name").load(result) + } + } + } as DataFetcher + + + def fetchers = ["Query": ["dogName": df1, "catName": df2]] + def schema = TestUtil.schema(sdl, fetchers) + def graphQL = GraphQL.newGraphQL(schema).build() + + def query = "{ dogName catName } " + def ei = newExecutionInput(query).dataLoaderRegistry(dataLoaderRegistry).build() + + + when: + def er = graphQL.executeAsync(ei) + Thread.sleep(1000) + then: + batchLoadCalls == 1 + !er.isDone() + } + + +} diff --git a/src/test/groovy/graphql/Issue2068.groovy b/src/test/groovy/graphql/Issue2068.groovy index 3273eab2cf..9b15e28085 100644 --- a/src/test/groovy/graphql/Issue2068.groovy +++ b/src/test/groovy/graphql/Issue2068.groovy @@ -65,8 +65,12 @@ class Issue2068 extends Specification { TimeUnit.MILLISECONDS, new SynchronousQueue<>(), threadFactory, new ThreadPoolExecutor.CallerRunsPolicy()) - DataFetcher nationsDf = { env -> env.getDataLoader("owner.nation").load(env) } - DataFetcher ownersDf = { env -> env.getDataLoader("dog.owner").load(env) } + DataFetcher nationsDf = { env -> + return env.getDataLoader("owner.nation").load(env) + } + DataFetcher ownersDf = { DataFetchingEnvironment env -> + return env.getDataLoader("dog.owner").load(env) + } def wiring = RuntimeWiring.newRuntimeWiring() .type(newTypeWiring("Query") @@ -75,6 +79,7 @@ class Issue2068 extends Specification { .dataFetcher("toys", new StaticDataFetcher(new AbstractList() { @Override Object get(int i) { +// return "toy" throw new RuntimeException("Simulated failure"); } @@ -120,7 +125,7 @@ class Issue2068 extends Specification { then: "execution with single instrumentation shouldn't hang" // wait for each future to complete and grab the results - thrown(RuntimeException) + def e = thrown(RuntimeException) when: graphql = GraphQL.newGraphQL(schema) diff --git a/src/test/groovy/graphql/MutationTest.groovy b/src/test/groovy/graphql/MutationTest.groovy index 5c872b1f83..a253d40657 100644 --- a/src/test/groovy/graphql/MutationTest.groovy +++ b/src/test/groovy/graphql/MutationTest.groovy @@ -1,5 +1,6 @@ package graphql +import graphql.execution.instrumentation.dataloader.DataLoaderDispatchingContextKeys import graphql.schema.DataFetcher import org.awaitility.Awaitility import org.dataloader.BatchLoader @@ -7,6 +8,7 @@ import org.dataloader.BatchLoaderWithContext import org.dataloader.DataLoaderFactory import org.dataloader.DataLoaderRegistry import spock.lang.Specification +import spock.lang.Unroll import java.util.concurrent.CompletableFuture @@ -229,6 +231,8 @@ class MutationTest extends Specification { This test shows a dataloader being called at the mutation field level, in serial via AsyncSerialExecutionStrategy, and then again at the sub field level, in parallel, via AsyncExecutionStrategy. */ + + @Unroll def "more complex async mutation with DataLoader"() { def sdl = """ type Query { @@ -435,7 +439,7 @@ class MutationTest extends Specification { } } } - """).dataLoaderRegistry(dlReg).build() + """).dataLoaderRegistry(dlReg).graphQLContext([DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING]: enableDataLoaderChaining).build() when: def cf = graphQL.executeAsync(ei) @@ -459,5 +463,254 @@ class MutationTest extends Specification { topLevelF3: expectedMap, topLevelF4: expectedMap, ] + + where: + enableDataLoaderChaining << [true, false] } + + + @Unroll + def "stress test mutation with dataloader"() { + when: + // concurrency bugs are hard to find, so run this test a lot of times + for (int i = 0; i < 150; i++) { + println "iteration $i" + runTest(enableDataLoaderChaining) + } + then: + noExceptionThrown() + + where: + enableDataLoaderChaining << [true, false] + } + + def runTest(boolean enableDataLoaderChaining) { + def sdl = """ + type Query { + q : String + } + + type Mutation { + topLevelF1(arg: Int) : ComplexType + topLevelF2(arg: Int) : ComplexType + topLevelF3(arg: Int) : ComplexType + topLevelF4(arg: Int) : ComplexType + } + + type ComplexType { + f1 : ComplexType + f2 : ComplexType + f3 : ComplexType + f4 : ComplexType + end : String + } + """ + + def emptyComplexMap = [ + f1: null, + f2: null, + f3: null, + f4: null, + ] + + BatchLoaderWithContext fieldBatchLoader = { keys, context -> + assert keys.size() == 2, "since only f1 and f2 are DL based, we will only get 2 key values" + + def batchValue = [ + emptyComplexMap, + emptyComplexMap, + ] + CompletableFuture.supplyAsync { + return batchValue + } + + } as BatchLoaderWithContext + + BatchLoader mutationBatchLoader = { keys -> + CompletableFuture.supplyAsync { + return keys + } + + } as BatchLoader + + + DataLoaderRegistry dlReg = DataLoaderRegistry.newRegistry() + .register("topLevelDL", DataLoaderFactory.newDataLoader(mutationBatchLoader)) + .register("fieldDL", DataLoaderFactory.newDataLoader(fieldBatchLoader)) + .build() + + def mutationDF = { env -> + def fieldName = env.getField().name + def factor = Integer.parseInt(fieldName.substring(fieldName.length() - 1)) + def value = env.getArgument("arg") + + def key = value + factor + return env.getDataLoader("topLevelDL").load(key) + } as DataFetcher + + def fieldDataLoaderDF = { env -> + def fieldName = env.getField().name + def level = env.getExecutionStepInfo().getPath().getLevel() + return env.getDataLoader("fieldDL").load(fieldName, level) + } as DataFetcher + + def fieldDataLoaderNonDF = { env -> + return emptyComplexMap + } as DataFetcher + + def schema = TestUtil.schema(sdl, + [Mutation : [ + topLevelF1: mutationDF, + topLevelF2: mutationDF, + topLevelF3: mutationDF, + topLevelF4: mutationDF, + ], + // only f1 and f3 are using data loaders - f2 and f4 are plain old property based + // so some fields with batch loader and some without + ComplexType: [ + f1: fieldDataLoaderDF, + f2: fieldDataLoaderNonDF, + f3: fieldDataLoaderDF, + f4: fieldDataLoaderNonDF, + ] + ]) + + + def graphQL = GraphQL.newGraphQL(schema) + .build() + + + def ei = ExecutionInput.newExecutionInput(""" + mutation m { + topLevelF1(arg:10) { + f1 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f2 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f3 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f4 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + } + + topLevelF2(arg:10) { + f1 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f2 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f3 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f4 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + } + + topLevelF3(arg:10) { + f1 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f2 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f3 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f4 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + } + + topLevelF4(arg:10) { + f1 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f2 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f3 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + f4 { + f1 { end } + f2 { end } + f3 { end } + f4 { end } + } + } + } + """).dataLoaderRegistry(dlReg).graphQLContext([(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining]).build() + def cf = graphQL.executeAsync(ei) + + Awaitility.await().until { cf.isDone() } + def er = cf.join() + + assert er.errors.isEmpty() + + def expectedMap = [ + f1: [f1: [end: null], f2: [end: null], f3: [end: null], f4: [end: null]], + f2: [f1: [end: null], f2: [end: null], f3: [end: null], f4: [end: null]], + f3: [f1: [end: null], f2: [end: null], f3: [end: null], f4: [end: null]], + f4: [f1: [end: null], f2: [end: null], f3: [end: null], f4: [end: null]], + ] + + assert er.data == [ + topLevelF1: expectedMap, + topLevelF2: expectedMap, + topLevelF3: expectedMap, + topLevelF4: expectedMap, + ] + } + } diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/BatchCompareDataFetchers.java b/src/test/groovy/graphql/execution/instrumentation/dataloader/BatchCompareDataFetchers.java index 3c43b94b5b..08edd13248 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/BatchCompareDataFetchers.java +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/BatchCompareDataFetchers.java @@ -10,7 +10,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -100,9 +99,9 @@ private static List> getDepartmentsForShops(List shops) { public DataLoader> departmentsForShopDataLoader = DataLoaderFactory.newDataLoader(departmentsForShopsBatchLoader); - public DataFetcher departmentsForShopDataLoaderDataFetcher = environment -> { + public DataFetcher>> departmentsForShopDataLoaderDataFetcher = environment -> { Shop shop = environment.getSource(); - return environment.getDataLoader("departments").load(shop.getId()); + return (CompletableFuture) environment.getDataLoader("departments").load(shop.getId()); }; // Products @@ -136,9 +135,9 @@ private static List> getProductsForDepartments(List de public DataLoader> productsForDepartmentDataLoader = DataLoaderFactory.newDataLoader(productsForDepartmentsBatchLoader); - public DataFetcher productsForDepartmentDataLoaderDataFetcher = environment -> { + public DataFetcher>> productsForDepartmentDataLoaderDataFetcher = environment -> { Department department = environment.getSource(); - return environment.getDataLoader("products").load(department.getId()); + return (CompletableFuture) environment.getDataLoader("products").load(department.getId()); }; private CompletableFuture maybeAsyncWithSleep(Supplier> supplier) { diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderCompanyProductMutationTest.groovy b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderCompanyProductMutationTest.groovy index 33cbb86d1f..13c105039f 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderCompanyProductMutationTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderCompanyProductMutationTest.groovy @@ -51,13 +51,13 @@ class DataLoaderCompanyProductMutationTest extends Specification { return environment.getDataLoader("projects-dl").load(source.getId()) })) .type( - newTypeWiring("Query").dataFetcher("companies", { - environment -> backend.getCompanies() - })) + newTypeWiring("Query").dataFetcher("companies", { + environment -> backend.getCompanies() + })) .type( - newTypeWiring("Mutation").dataFetcher("addCompany", { - environment -> backend.addCompany() - })) + newTypeWiring("Mutation").dataFetcher("addCompany", { + environment -> backend.addCompany() + })) .build() def registry = new DataLoaderRegistry() @@ -71,6 +71,7 @@ class DataLoaderCompanyProductMutationTest extends Specification { ExecutionInput executionInput = ExecutionInput.newExecutionInput() .query(query) .dataLoaderRegistry(registry) + .graphQLContext([(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): false]) .build() when: diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderDispatcherTest.groovy b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderDispatcherTest.groovy index 2996305f52..27e820750f 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderDispatcherTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderDispatcherTest.groovy @@ -56,8 +56,6 @@ class DataLoaderDispatcherTest extends Specification { ] - - def "dispatch is called if there are data loaders"() { def dispatchedCalled = false def dataLoaderRegistry = new DataLoaderRegistry() { @@ -77,6 +75,7 @@ class DataLoaderDispatcherTest extends Specification { def graphQL = GraphQL.newGraphQL(starWarsSchema).build() def executionInput = newExecutionInput().dataLoaderRegistry(dataLoaderRegistry).query('{ hero { name } }').build() + executionInput.getGraphQLContext().put(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING, false) when: def er = graphQL.execute(executionInput) @@ -246,6 +245,7 @@ class DataLoaderDispatcherTest extends Specification { when: def executionInput = newExecutionInput().dataLoaderRegistry(dataLoaderRegistry).query('{ field }').build() + executionInput.getGraphQLContext().put(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING, false) def er = graphql.execute(executionInput) then: diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderHangingTest.groovy b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderHangingTest.groovy index 00dd49a098..f6670cc301 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderHangingTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderHangingTest.groovy @@ -22,6 +22,7 @@ import org.dataloader.DataLoaderFactory import org.dataloader.DataLoaderOptions import org.dataloader.DataLoaderRegistry import spock.lang.Specification +import spock.lang.Unroll import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletionStage @@ -38,6 +39,7 @@ class DataLoaderHangingTest extends Specification { public static final int NUM_OF_REPS = 50 + @Unroll def "deadlock attempt"() { setup: def sdl = """ @@ -97,8 +99,12 @@ class DataLoaderHangingTest extends Specification { TimeUnit.MILLISECONDS, new SynchronousQueue<>(), threadFactory, new ThreadPoolExecutor.CallerRunsPolicy()) - DataFetcher albumsDf = { env -> env.getDataLoader("artist.albums").load(env) } - DataFetcher songsDf = { env -> env.getDataLoader("album.songs").load(env) } + DataFetcher albumsDf = { env -> + env.getDataLoader("artist.albums").load(env) + } + DataFetcher songsDf = { env -> + env.getDataLoader("album.songs").load(env) + } def dataFetcherArtists = new DataFetcher() { @Override @@ -134,6 +140,7 @@ class DataLoaderHangingTest extends Specification { def result = graphql.executeAsync(newExecutionInput() .dataLoaderRegistry(dataLoaderRegistry) + .graphQLContext([(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining] as Map) .query(""" query getArtistsWithData { listArtists(limit: 1) { @@ -174,6 +181,10 @@ class DataLoaderHangingTest extends Specification { results.each { assert it.errors.empty } }) .join() + + where: + enableDataLoaderChaining << [true, false] + } private DataLoaderRegistry mkNewDataLoaderRegistry(executor) { @@ -359,6 +370,7 @@ class DataLoaderHangingTest extends Specification { ExecutionInput executionInput = newExecutionInput() .query(query) .graphQLContext(["registry": registry]) + .graphQLContext([(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): false]) .dataLoaderRegistry(registry) .build() @@ -369,4 +381,4 @@ class DataLoaderHangingTest extends Specification { (executionResult.errors.size() > 0) } -} \ No newline at end of file +} diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderNodeTest.groovy b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderNodeTest.groovy index 16d00be727..46378c79a1 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderNodeTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderNodeTest.groovy @@ -137,9 +137,10 @@ class DataLoaderNodeTest extends Specification { .build() ExecutionResult result = GraphQL.newGraphQL(schema) -// .instrumentation(new DataLoaderDispatcherInstrumentation()) .build() - .execute(ExecutionInput.newExecutionInput().dataLoaderRegistry(registry).query( + .execute(ExecutionInput.newExecutionInput() + .graphQLContext([(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining]) + .dataLoaderRegistry(registry).query( ''' query Q { root { @@ -178,5 +179,10 @@ class DataLoaderNodeTest extends Specification { // // but currently is this nodeLoads.size() == 3 // WOOT! + + where: + enableDataLoaderChaining << [true, false] + + } } diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderPerformanceTest.groovy b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderPerformanceTest.groovy index c4239243ca..5d9b1609c7 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderPerformanceTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderPerformanceTest.groovy @@ -29,7 +29,7 @@ class DataLoaderPerformanceTest extends Specification { ExecutionInput executionInput = ExecutionInput.newExecutionInput() .query(getQuery()) .dataLoaderRegistry(dataLoaderRegistry) - .graphQLContext([(ENABLE_INCREMENTAL_SUPPORT): incrementalSupport]) + .graphQLContext([(ENABLE_INCREMENTAL_SUPPORT): incrementalSupport, (DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining]) .build() def result = graphQL.execute(executionInput) @@ -42,6 +42,7 @@ class DataLoaderPerformanceTest extends Specification { where: incrementalSupport << [true, false] + enableDataLoaderChaining << [true, false] } def "970 ensure data loader is performant for multiple field with lists"() { @@ -51,7 +52,7 @@ class DataLoaderPerformanceTest extends Specification { ExecutionInput executionInput = ExecutionInput.newExecutionInput() .query(getExpensiveQuery(false)) .dataLoaderRegistry(dataLoaderRegistry) - .graphQLContext([(ENABLE_INCREMENTAL_SUPPORT): incrementalSupport]) + .graphQLContext([(ENABLE_INCREMENTAL_SUPPORT): incrementalSupport, (DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining]) .build() def result = graphQL.execute(executionInput) @@ -63,6 +64,7 @@ class DataLoaderPerformanceTest extends Specification { where: incrementalSupport << [true, false] + enableDataLoaderChaining << [true, false] } def "ensure data loader is performant for lists using async batch loading"() { @@ -74,7 +76,7 @@ class DataLoaderPerformanceTest extends Specification { ExecutionInput executionInput = ExecutionInput.newExecutionInput() .query(getQuery()) .dataLoaderRegistry(dataLoaderRegistry) - .graphQLContext([(ENABLE_INCREMENTAL_SUPPORT): incrementalSupport]) + .graphQLContext([(ENABLE_INCREMENTAL_SUPPORT): incrementalSupport, (DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining]) .build() def result = graphQL.execute(executionInput) @@ -88,6 +90,7 @@ class DataLoaderPerformanceTest extends Specification { where: incrementalSupport << [true, false] + enableDataLoaderChaining << [true, false] } def "970 ensure data loader is performant for multiple field with lists using async batch loading"() { @@ -99,7 +102,7 @@ class DataLoaderPerformanceTest extends Specification { ExecutionInput executionInput = ExecutionInput.newExecutionInput() .query(getExpensiveQuery(false)) .dataLoaderRegistry(dataLoaderRegistry) - .graphQLContext([(ENABLE_INCREMENTAL_SUPPORT): incrementalSupport]) + .graphQLContext([(ENABLE_INCREMENTAL_SUPPORT): incrementalSupport, (DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining]) .build() def result = graphQL.execute(executionInput) @@ -112,5 +115,7 @@ class DataLoaderPerformanceTest extends Specification { where: incrementalSupport << [true, false] + enableDataLoaderChaining << [true, false] + } } diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderTypeMismatchTest.groovy b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderTypeMismatchTest.groovy index 5b6f1cfb2f..61e444b70c 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderTypeMismatchTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/DataLoaderTypeMismatchTest.groovy @@ -57,7 +57,7 @@ class DataLoaderTypeMismatchTest extends Specification { def wiring = RuntimeWiring.newRuntimeWiring() .type(newTypeWiring("Query") - .dataFetcher("getTodos", todosDef)) + .dataFetcher("getTodos", todosDef)) .build() def schema = new SchemaGenerator().makeExecutableSchema(typeDefinitionRegistry, wiring) @@ -66,10 +66,16 @@ class DataLoaderTypeMismatchTest extends Specification { .build() when: - def result = graphql.execute(ExecutionInput.newExecutionInput().dataLoaderRegistry(dataLoaderRegistry).query("query { getTodos { id } }").build()) + def result = graphql.execute(ExecutionInput.newExecutionInput() + .graphQLContext([(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining]) + .dataLoaderRegistry(dataLoaderRegistry).query("query { getTodos { id } }").build()) then: "execution shouldn't hang" !result.errors.empty result.errors[0].message == "Can't resolve value (/getTodos) : type mismatch error, expected type LIST" + + where: + enableDataLoaderChaining << [true, false] + } } diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/Issue1178DataLoaderDispatchTest.groovy b/src/test/groovy/graphql/execution/instrumentation/dataloader/Issue1178DataLoaderDispatchTest.groovy index 135b52ba8d..27f884f2c4 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/Issue1178DataLoaderDispatchTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/Issue1178DataLoaderDispatchTest.groovy @@ -80,7 +80,9 @@ class Issue1178DataLoaderDispatchTest extends Specification { then: "execution shouldn't error" for (int i = 0; i < NUM_OF_REPS; i++) { - def result = graphql.execute(ExecutionInput.newExecutionInput().dataLoaderRegistry(dataLoaderRegistry) + def result = graphql.execute(ExecutionInput.newExecutionInput() + .graphQLContext([(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining]) + .dataLoaderRegistry(dataLoaderRegistry) .query(""" query { getTodos { __typename id @@ -116,6 +118,9 @@ class Issue1178DataLoaderDispatchTest extends Specification { }""").build()) assert result.errors.empty } + where: + enableDataLoaderChaining << [true, false] + } static class MyDataFetcher implements DataFetcher> { diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/PeopleCompaniesAndProductsDataLoaderTest.groovy b/src/test/groovy/graphql/execution/instrumentation/dataloader/PeopleCompaniesAndProductsDataLoaderTest.groovy index 0cc9a73c40..e38f6334b8 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/PeopleCompaniesAndProductsDataLoaderTest.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/PeopleCompaniesAndProductsDataLoaderTest.groovy @@ -105,9 +105,9 @@ class PeopleCompaniesAndProductsDataLoaderTest extends Specification { @Override Object get(DataFetchingEnvironment environment) { Product source = environment.getSource() - DataLoaderRegistry dlRegistry = environment.getGraphQlContext().get("registry") - DataLoader personDL = dlRegistry.getDataLoader("person") - return personDL.load(source.getSuppliedById()) +// DataLoaderRegistry dlRegistry = environment.getGraphQlContext().get("registry") +// DataLoader personDL = dlRegistry.getDataLoader("person") + return environment.getDataLoader("person").load(source.getSuppliedById()) } } @@ -115,10 +115,10 @@ class PeopleCompaniesAndProductsDataLoaderTest extends Specification { @Override Object get(DataFetchingEnvironment environment) { Product source = environment.getSource() - DataLoaderRegistry dlRegistry = environment.getGraphQlContext().get("registry") - DataLoader personDL = dlRegistry.getDataLoader("person") +// DataLoaderRegistry dlRegistry = environment.getGraphQlContext().get("registry") +// DataLoader personDL = dlRegistry.getDataLoader("person") - return personDL.loadMany(source.getMadeByIds()) + return environment.getDataLoader("person").loadMany(source.getMadeByIds()) } } @@ -126,9 +126,9 @@ class PeopleCompaniesAndProductsDataLoaderTest extends Specification { @Override Object get(DataFetchingEnvironment environment) { Person source = environment.getSource() - DataLoaderRegistry dlRegistry = environment.getGraphQlContext().get("registry") - DataLoader companyDL = dlRegistry.getDataLoader("company") - return companyDL.load(source.getCompanyId()) +// DataLoaderRegistry dlRegistry = environment.getGraphQlContext().get("registry") +// DataLoader companyDL = dlRegistry.getDataLoader("company") + return environment.getDataLoader("company").load(source.getCompanyId()) } } @@ -191,6 +191,7 @@ class PeopleCompaniesAndProductsDataLoaderTest extends Specification { ExecutionInput executionInput = ExecutionInput.newExecutionInput() .query(query) .graphQLContext(["registry": registry]) + .graphQLContext([(DataLoaderDispatchingContextKeys.ENABLE_DATA_LOADER_CHAINING): enableDataLoaderChaining]) .dataLoaderRegistry(registry) .build() @@ -208,5 +209,8 @@ class PeopleCompaniesAndProductsDataLoaderTest extends Specification { companyBatchLoadInvocationCount == 1 + where: + enableDataLoaderChaining << [true, false] + } } diff --git a/src/test/groovy/graphql/execution/instrumentation/dataloader/StarWarsDataLoaderWiring.groovy b/src/test/groovy/graphql/execution/instrumentation/dataloader/StarWarsDataLoaderWiring.groovy index 757d5564a0..25189732b4 100644 --- a/src/test/groovy/graphql/execution/instrumentation/dataloader/StarWarsDataLoaderWiring.groovy +++ b/src/test/groovy/graphql/execution/instrumentation/dataloader/StarWarsDataLoaderWiring.groovy @@ -43,6 +43,7 @@ class StarWarsDataLoaderWiring { BatchLoader characterBatchLoader = new BatchLoader() { @Override CompletionStage> load(List keys) { + println "loading characters via batch loader for keys: $keys" batchFunctionLoadCount++ // @@ -53,7 +54,9 @@ class StarWarsDataLoaderWiring { // // async supply of values CompletableFuture.supplyAsync({ - return getCharacterDataViaBatchHTTPApi(keys) + def result = getCharacterDataViaBatchHTTPApi(keys) + println "result " + result + " for keys: $keys" + return result }) } @@ -98,7 +101,16 @@ class StarWarsDataLoaderWiring { Object get(DataFetchingEnvironment environment) { List friendIds = environment.source.friends naiveLoadCount += friendIds.size() - return environment.getDataLoader("character").loadMany(friendIds) + + def many = environment.getDataLoader("character").loadMany(friendIds) + many.whenComplete { result, error -> + if (error != null) { + println "Error loading friends: $error" + } else { + println "Loaded friends: $result" + } + } + return many } } diff --git a/src/test/groovy/graphql/schema/DataFetchingEnvironmentImplTest.groovy b/src/test/groovy/graphql/schema/DataFetchingEnvironmentImplTest.groovy index 36aa87eb54..34f01ce797 100644 --- a/src/test/groovy/graphql/schema/DataFetchingEnvironmentImplTest.groovy +++ b/src/test/groovy/graphql/schema/DataFetchingEnvironmentImplTest.groovy @@ -73,7 +73,8 @@ class DataFetchingEnvironmentImplTest extends Specification { dfe.getVariables() == variables dfe.getOperationDefinition() == operationDefinition dfe.getExecutionId() == executionId - dfe.getDataLoader("dataLoader") != null + dfe.getDataLoaderRegistry() == executionContext.getDataLoaderRegistry() + dfe.getDataLoader("dataLoader").delegate == executionContext.getDataLoaderRegistry().getDataLoader("dataLoader") } def "create environment from existing one will copy everything to new instance"() { @@ -118,7 +119,7 @@ class DataFetchingEnvironmentImplTest extends Specification { dfe.getDocument() == dfeCopy.getDocument() dfe.getOperationDefinition() == dfeCopy.getOperationDefinition() dfe.getVariables() == dfeCopy.getVariables() - dfe.getDataLoader("dataLoader") != null + dfe.getDataLoader("dataLoader").delegate == dfeCopy.getDataLoader("dataLoader").delegate dfe.getLocale() == dfeCopy.getLocale() dfe.getLocalContext() == dfeCopy.getLocalContext() }