From 0a2383bef2c945ab4b1f2ba226c4d0c1867cd99f Mon Sep 17 00:00:00 2001 From: Adwait Kumar Singh Date: Mon, 18 May 2026 16:06:55 -0700 Subject: [PATCH] Add OutOfOrder benchmarks --- .../model/operations/CopyObject.smithy | 60 +++++ .../model/operations/GetItem.smithy | 81 ++++++ .../model/operations/GetMetricData.smithy | 243 ++++++++++++++++++ .../serde/AwsJson1_0DeserializeBenchmark.java | 1 + .../serde/AwsQueryDeserializeBenchmark.java | 1 + .../serde/RestJson1DeserializeBenchmark.java | 1 + .../serde/RestXmlDeserializeBenchmark.java | 1 + .../serde/RpcV2CborDeserializeBenchmark.java | 1 + 8 files changed, 389 insertions(+) diff --git a/benchmarks/serde-benchmarks/model/operations/CopyObject.smithy b/benchmarks/serde-benchmarks/model/operations/CopyObject.smithy index c7758b897..54c37a4b3 100644 --- a/benchmarks/serde-benchmarks/model/operations/CopyObject.smithy +++ b/benchmarks/serde-benchmarks/model/operations/CopyObject.smithy @@ -119,6 +119,66 @@ use smithy.test#httpResponseTests """ tags: ["serde-benchmark"] } + // section: out-of-order + unknown fields + { + id: "restXml_CopyObjectOutput_OutOfOrder" + documentation: """ + Fields in reverse order with unknown elements interspersed. + """ + protocol: restXml + code: 200 + headers: { "x-amz-expiration": "expiry-date=\"Fri, 01 Jan 2022 00:00:00 GMT\", rule-id=\"rule1\"", "x-amz-copy-source-version-id": "source-version-id-12345", "x-amz-version-id": "dest-version-id-67890", "x-amz-server-side-encryption": "AES256", "x-amz-server-side-encryption-customer-algorithm": "AES256", "x-amz-server-side-encryption-customer-key-MD5": "customer-key-md5-hash", "x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012", "x-amz-server-side-encryption-context": "encryption-context", "x-amz-server-side-encryption-bucket-key-enabled": "true", "x-amz-request-charged": "requester" } + body: """ + + skip-this-value + checksum-sha256 + checksum-sha1 + + should-be-ignored + + checksum-crc64nvme + checksum-crc32c + checksum-crc32 + true + SHA256 + 2021-01-01T00:00:00.000Z + + one + two + + "9bb58f26192e4ba00f01e2e7b136bbd8" + 0 + + """ + tags: ["serde-benchmark"] + } + { + id: "restJson1_CopyObjectOutput_OutOfOrder" + documentation: """ + Fields in reverse order with unknown fields interspersed. + """ + protocol: restJson1 + code: 200 + headers: { "x-amz-expiration": "expiry-date=\"Fri, 01 Jan 2022 00:00:00 GMT\", rule-id=\"rule1\"", "x-amz-copy-source-version-id": "source-version-id-12345", "x-amz-version-id": "dest-version-id-67890", "x-amz-server-side-encryption": "AES256", "x-amz-server-side-encryption-customer-algorithm": "AES256", "x-amz-server-side-encryption-customer-key-MD5": "customer-key-md5-hash", "x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012", "x-amz-server-side-encryption-context": "encryption-context", "x-amz-server-side-encryption-bucket-key-enabled": "true", "x-amz-request-charged": "requester" } + body: """ + { + "__unknownFirst": "skip-me", + "ChecksumSHA256": "checksum-sha256", + "ChecksumSHA1": "checksum-sha1", + "__unknownMiddleObj": {"foo": "bar", "num": 123}, + "ChecksumCRC64NVME": "checksum-crc64nvme", + "ChecksumCRC32C": "checksum-crc32c", + "ChecksumCRC32": "checksum-crc32", + "__unknownBool": false, + "ChecksumType": "SHA256", + "LastModified": 1609459200, + "__unknownArray": [1, "two", true], + "ETag": "\\"9bb58f26192e4ba00f01e2e7b136bbd8\\"", + "__unknownLast": 0 + } + """ + tags: ["serde-benchmark"] + } ]) operation CopyObject { input: CopyObjectRequest diff --git a/benchmarks/serde-benchmarks/model/operations/GetItem.smithy b/benchmarks/serde-benchmarks/model/operations/GetItem.smithy index bfd778ca0..1f5dcbb04 100644 --- a/benchmarks/serde-benchmarks/model/operations/GetItem.smithy +++ b/benchmarks/serde-benchmarks/model/operations/GetItem.smithy @@ -1947,6 +1947,87 @@ use smithy.test#httpResponseTests """ tags: ["serde-benchmark"] } + // section: out-of-order + unknown fields + { + id: "awsJson1_0_GetItemOutput_OutOfOrder" + documentation: """ + Fields in reverse order with unknown fields interspersed. + """ + protocol: awsJson1_0 + code: 200 + body: """ + { + "__unknownString": "unexpected", + "ConsumedCapacity": { + "ReadCapacityUnits": 2.5, + "__unknownBool": true, + "CapacityUnits": 2.5, + "TableName": "pasta-recipes" + }, + "__unknownNumber": 99999, + "Item": { + "nutrition": { + "M": { + "__unknownNested": { "S": "should-be-skipped" }, + "fat": { "N": "28" }, + "carbs": { "N": "45" }, + "protein": { "N": "18" }, + "calories": { "N": "520" } + } + }, + "ingredients": { + "L": [ + { "M": { "amount": { "S": "1/2 cup" }, "item": { "S": "heavy cream" } } }, + { "M": { "amount": { "S": "1 cup grated" }, "item": { "S": "parmesan cheese" } } }, + { "M": { "amount": { "S": "1/2 cup" }, "item": { "S": "butter" } } }, + { "M": { "amount": { "S": "1 lb" }, "item": { "S": "fettuccine pasta" } } } + ] + }, + "tags": { "SS": ["vegetarian", "comfort-food", "creamy"] }, + "rating": { "N": "4.6" }, + "servings": { "N": "4" }, + "cuisine": { "S": "Italian" }, + "difficulty": { "S": "Easy" }, + "prep_time": { "N": "15" }, + "cook_time": { "N": "25" }, + "description": { + "S": "Creamy, rich pasta dish with butter, parmesan cheese, and fresh fettuccine noodles" + }, + "name": { "S": "Fettuccine Alfredo" }, + "id": { "S": "recipe-002" } + }, + "__unknownArray": [1, 2, 3], + "__unknownObject": { "nested": "value", "count": 42 } + } + """ + tags: ["serde-benchmark"] + } + { + id: "rpcv2Cbor_GetItemOutput_OutOfOrder" + documentation: """ + Fields in reverse order with unknown fields interspersed (CBOR). + """ + protocol: rpcv2Cbor + headers: { "smithy-protocol": "rpc-v2-cbor" } + code: 200 + body: """ + pm9fX3Vua25vd25TdHJpbmdqdW5leHBlY3RlZHBDb25zdW1lZENhcGFjaXR5pHFSZWFkQ2FwYWNp + dHlVbml0c/tABAAAAAAAAG1fX3Vua25vd25Cb29s9W1DYXBhY2l0eVVuaXRz+0AEAAAAAAAAaVRh + YmxlTmFtZW1wYXN0YS1yZWNpcGVzb19fdW5rbm93bk51bWJlchoAAYafZEl0ZW2saW51dHJpdGlv + bqFhTaVvX191bmtub3duTmVzdGVkoWFTcXNob3VsZC1iZS1za2lwcGVkY2ZhdKFhTmIyOGVjYXJi + c6FhTmI0NWdwcm90ZWluoWFOYjE4aGNhbG9yaWVzoWFOYzUyMGtpbmdyZWRpZW50c6FhTIShYU2i + ZmFtb3VudKFhU2cxLzIgY3VwZGl0ZW2hYVNraGVhdnkgY3JlYW2hYU2iZmFtb3VudKFhU2wxIGN1 + cCBncmF0ZWRkaXRlbaFhU29wYXJtZXNhbiBjaGVlc2WhYU2iZmFtb3VudKFhU2cxLzIgY3VwZGl0 + ZW2hYVNmYnV0dGVyoWFNomZhbW91bnShYVNkMSBsYmRpdGVtoWFTcGZldHR1Y2NpbmUgcGFzdGFk + dGFnc6FiU1ODanZlZ2V0YXJpYW5sY29tZm9ydC1mb29kZmNyZWFteWZyYXRpbmehYU5jNC42aHNl + cnZpbmdzoWFOYTRnY3Vpc2luZaFhU2dJdGFsaWFuamRpZmZpY3VsdHmhYVNkRWFzeWlwcmVwX3Rp + bWWhYU5iMTVpY29va190aW1loWFOYjI1a2Rlc2NyaXB0aW9uoWFTeFJDcmVhbXksIHJpY2ggcGFz + dGEgZGlzaCB3aXRoIGJ1dHRlciwgcGFybWVzYW4gY2hlZXNlLCBhbmQgZnJlc2ggZmV0dHVjY2lu + ZSBub29kbGVzZG5hbWWhYVNyRmV0dHVjY2luZSBBbGZyZWRvYmlkoWFTanJlY2lwZS0wMDJuX191 + bmtub3duQXJyYXmDAQIDb19fdW5rbm93bk9iamVjdKJmbmVzdGVkZXZhbHVlZWNvdW50GCo= + """ + tags: ["serde-benchmark"] + } ]) operation GetItem { input: GetItemInput diff --git a/benchmarks/serde-benchmarks/model/operations/GetMetricData.smithy b/benchmarks/serde-benchmarks/model/operations/GetMetricData.smithy index 563472f28..f1d53a788 100644 --- a/benchmarks/serde-benchmarks/model/operations/GetMetricData.smithy +++ b/benchmarks/serde-benchmarks/model/operations/GetMetricData.smithy @@ -2955,6 +2955,249 @@ use smithy.test#httpResponseTests } tags: ["serde-benchmark"] } + // section: out-of-order + unknown fields + { + id: "awsQuery_GetMetricDataResponse_OutOfOrder" + documentation: """ + Fields in reverse order with unknown elements interspersed. + """ + protocol: awsQuery + code: 200 + body: """ + + + should-skip + + + InfoOnly + Some metrics delayed + + + nextTokenValue123 + + + skip + Complete + + 72.5 + 75 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m1 + + + Complete + + 58 + 60 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m2 + + + Complete + + 47 + 45 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m3 + + + Complete + + 1100 + 1024 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m4 + + + Complete + + 2200 + 2048 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m5 + + + Complete + + 95 + 100 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m6 + + + Complete + + 145 + 150 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m7 + + + Complete + + 48 + 50 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m8 + + + Complete + + 72 + 75 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m9 + + + Complete + + 0 + 0 + + + 2021-01-01T00:05:00Z + 2021-01-01T00:00:00Z + + + m10 + + + also-skip + + + 12345678-1234-1234-1234-123456789014 + + + """ + params: { + MetricDataResults: [ + { + Id: "m1" + Label: "alpacas_found" + Timestamps: [1609459200, 1609459500] + Values: [75.0, 72.5] + StatusCode: "Complete" + } + { + Id: "m2" + Label: "llamas_sleeping" + Timestamps: [1609459200, 1609459500] + Values: [60.0, 58.0] + StatusCode: "Complete" + } + { + Id: "m3" + Label: "penguins_waddling" + Timestamps: [1609459200, 1609459500] + Values: [45.0, 47.0] + StatusCode: "Complete" + } + { + Id: "m4" + Label: "dolphins_jumping" + Timestamps: [1609459200, 1609459500] + Values: [1024.0, 1100.0] + StatusCode: "Complete" + } + { + Id: "m5" + Label: "elephants_trumpeting" + Timestamps: [1609459200, 1609459500] + Values: [2048.0, 2200.0] + StatusCode: "Complete" + } + { + Id: "m6" + Label: "giraffes_eating" + Timestamps: [1609459200, 1609459500] + Values: [100.0, 95.0] + StatusCode: "Complete" + } + { + Id: "m7" + Label: "zebras_running" + Timestamps: [1609459200, 1609459500] + Values: [150.0, 145.0] + StatusCode: "Complete" + } + { + Id: "m8" + Label: "pandas_munching" + Timestamps: [1609459200, 1609459500] + Values: [50.0, 48.0] + StatusCode: "Complete" + } + { + Id: "m9" + Label: "koalas_napping" + Timestamps: [1609459200, 1609459500] + Values: [75.0, 72.0] + StatusCode: "Complete" + } + { + Id: "m10" + Label: "kangaroos_hopping" + Timestamps: [1609459200, 1609459500] + Values: [0.0, 0.0] + StatusCode: "Complete" + } + ] + NextToken: "nextTokenValue123" + Messages: [ + { + Code: "InfoOnly" + Value: "Some metrics delayed" + } + ] + } + tags: ["serde-benchmark"] + } ]) operation GetMetricData { input: GetMetricDataInput diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsJson1_0DeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsJson1_0DeserializeBenchmark.java index b4b2b5240..e9155bb3a 100644 --- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsJson1_0DeserializeBenchmark.java +++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsJson1_0DeserializeBenchmark.java @@ -37,6 +37,7 @@ public class AwsJson1_0DeserializeBenchmark { "awsJson1_0_GetItemOutput_S", "awsJson1_0_GetItemOutput_M", "awsJson1_0_GetItemOutput_L", + "awsJson1_0_GetItemOutput_OutOfOrder", "awsJson1_0_GetItemOutputBinary_S", "awsJson1_0_GetItemOutputBinary_M", "awsJson1_0_GetItemOutputBinary_L", diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsQueryDeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsQueryDeserializeBenchmark.java index bf05d94f6..2709d5550 100644 --- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsQueryDeserializeBenchmark.java +++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/AwsQueryDeserializeBenchmark.java @@ -35,6 +35,7 @@ public class AwsQueryDeserializeBenchmark { "awsQuery_GetMetricDataResponse_S", "awsQuery_GetMetricDataResponse_M", "awsQuery_GetMetricDataResponse_L", + "awsQuery_GetMetricDataResponse_OutOfOrder", }) public String testCaseId; diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestJson1DeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestJson1DeserializeBenchmark.java index e351e93a7..6af7dfab0 100644 --- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestJson1DeserializeBenchmark.java +++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestJson1DeserializeBenchmark.java @@ -35,6 +35,7 @@ public class RestJson1DeserializeBenchmark { @Param({ "restJson1_CopyObjectOutput_Baseline", "restJson1_CopyObjectOutput_M", + "restJson1_CopyObjectOutput_OutOfOrder", "restJson1_GetObject_S", "restJson1_GetObject_M", "restJson1_GetObject_L", diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestXmlDeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestXmlDeserializeBenchmark.java index 60ee72420..d6c02c9b2 100644 --- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestXmlDeserializeBenchmark.java +++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RestXmlDeserializeBenchmark.java @@ -35,6 +35,7 @@ public class RestXmlDeserializeBenchmark { @Param({ "restXml_CopyObjectOutput_Baseline", "restXml_CopyObjectOutput_M", + "restXml_CopyObjectOutput_OutOfOrder", "restXml_GetObject_S", "restXml_GetObject_M", "restXml_GetObject_L", diff --git a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RpcV2CborDeserializeBenchmark.java b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RpcV2CborDeserializeBenchmark.java index 6ae937c77..5161ed658 100644 --- a/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RpcV2CborDeserializeBenchmark.java +++ b/benchmarks/serde-benchmarks/src/jmh/java/software/amazon/smithy/java/benchmarks/serde/RpcV2CborDeserializeBenchmark.java @@ -41,6 +41,7 @@ public class RpcV2CborDeserializeBenchmark { "rpcv2Cbor_GetItemOutput_S", "rpcv2Cbor_GetItemOutput_M", "rpcv2Cbor_GetItemOutput_L", + "rpcv2Cbor_GetItemOutput_OutOfOrder", "rpcv2Cbor_GetItemOutputBinary_S", "rpcv2Cbor_GetItemOutputBinary_M", "rpcv2Cbor_GetItemOutputBinary_L",