1 /* 2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"). 5 * You may not use this file except in compliance with the License. 6 * A copy of the License is located at 7 * 8 * http://aws.amazon.com/apache2.0 9 * 10 * or in the "license" file accompanying this file. This file is distributed 11 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 12 * express or implied. See the License for the specific language governing 13 * permissions and limitations under the License. 14 */ 15 16 package software.amazon.awssdk.benchmark.enhanced.dynamodb; 17 18 import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; 19 import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; 20 import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression; 21 import com.amazonaws.services.dynamodbv2.model.ScanResult; 22 import java.util.Arrays; 23 import org.openjdk.jmh.annotations.Benchmark; 24 import org.openjdk.jmh.annotations.BenchmarkMode; 25 import org.openjdk.jmh.annotations.Fork; 26 import org.openjdk.jmh.annotations.Measurement; 27 import org.openjdk.jmh.annotations.Mode; 28 import org.openjdk.jmh.annotations.Param; 29 import org.openjdk.jmh.annotations.Scope; 30 import org.openjdk.jmh.annotations.Setup; 31 import org.openjdk.jmh.annotations.State; 32 import org.openjdk.jmh.annotations.Warmup; 33 import org.openjdk.jmh.infra.Blackhole; 34 import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient; 35 import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable; 36 import software.amazon.awssdk.enhanced.dynamodb.TableSchema; 37 import software.amazon.awssdk.services.dynamodb.DynamoDbClient; 38 import software.amazon.awssdk.services.dynamodb.model.ScanResponse; 39 40 @BenchmarkMode(Mode.Throughput) 41 @Warmup(iterations = 5) 42 @Measurement(iterations = 5) 43 @Fork(2) 44 @State(Scope.Benchmark) 45 public class EnhancedClientScanV1MapperComparisonBenchmark { 46 private static final V2ItemFactory V2_ITEM_FACTORY = new V2ItemFactory(); 47 private static final V1ItemFactory V1_ITEM_FACTORY = new V1ItemFactory(); 48 private static final DynamoDBScanExpression V1_SCAN_EXPRESSION = new DynamoDBScanExpression(); 49 50 @Benchmark v2Scan(TestState s)51 public Object v2Scan(TestState s) { 52 return s.v2Table.scan().iterator().next(); 53 } 54 55 @Benchmark v1Scan(TestState s)56 public Object v1Scan(TestState s) { 57 return s.v1DdbMapper.scan(s.testItem.getV1BeanClass(), V1_SCAN_EXPRESSION).iterator().next(); 58 } 59 getV2Client(Blackhole bh, ScanResponse scanResponse)60 private static DynamoDbClient getV2Client(Blackhole bh, ScanResponse scanResponse) { 61 return new V2TestDynamoDbScanClient(bh, scanResponse); 62 } 63 getV1Client(Blackhole bh, ScanResult scanResult)64 private static AmazonDynamoDB getV1Client(Blackhole bh, ScanResult scanResult) { 65 return new V1TestDynamoDbScanClient(bh, scanResult); 66 } 67 68 @State(Scope.Benchmark) 69 public static class TestState { 70 @Param({"TINY", "SMALL", "HUGE", "HUGE_FLAT"}) 71 public TestItem testItem; 72 73 private DynamoDbTable<?> v2Table; 74 private DynamoDBMapper v1DdbMapper; 75 76 77 @Setup setup(Blackhole bh)78 public void setup(Blackhole bh) { 79 DynamoDbEnhancedClient v2DdbEnh = DynamoDbEnhancedClient.builder() 80 .dynamoDbClient(getV2Client(bh, testItem.v2Response)) 81 .build(); 82 83 v2Table = v2DdbEnh.table(testItem.name(), testItem.schema); 84 85 v1DdbMapper = new DynamoDBMapper(getV1Client(bh, testItem.v1Response)); 86 } 87 88 public enum TestItem { 89 TINY( 90 V2ItemFactory.TINY_BEAN_TABLE_SCHEMA, 91 ScanResponse.builder() 92 .items(Arrays.asList(V2_ITEM_FACTORY.tiny(), 93 V2_ITEM_FACTORY.tiny(), 94 V2_ITEM_FACTORY.tiny())) 95 .build(), 96 97 V1ItemFactory.V1TinyBean.class, 98 new ScanResult().withItems( 99 Arrays.asList(V1_ITEM_FACTORY.tiny(), V1_ITEM_FACTORY.tiny(), V1_ITEM_FACTORY.tiny())) 100 ), 101 SMALL( 102 V2ItemFactory.SMALL_BEAN_TABLE_SCHEMA, 103 ScanResponse.builder() 104 .items(Arrays.asList(V2_ITEM_FACTORY.small(), 105 V2_ITEM_FACTORY.small(), 106 V2_ITEM_FACTORY.small())) 107 .build(), 108 109 V1ItemFactory.V1SmallBean.class, 110 new ScanResult().withItems( 111 Arrays.asList(V1_ITEM_FACTORY.small(), V1_ITEM_FACTORY.small(), V1_ITEM_FACTORY.small())) 112 ), 113 114 HUGE( 115 V2ItemFactory.HUGE_BEAN_TABLE_SCHEMA, 116 ScanResponse.builder() 117 .items(Arrays.asList(V2_ITEM_FACTORY.huge(), 118 V2_ITEM_FACTORY.huge(), 119 V2_ITEM_FACTORY.huge())) 120 .build(), 121 122 V1ItemFactory.V1HugeBean.class, 123 new ScanResult().withItems( 124 Arrays.asList(V1_ITEM_FACTORY.huge(), V1_ITEM_FACTORY.huge(), V1_ITEM_FACTORY.huge())) 125 ), 126 127 HUGE_FLAT( 128 V2ItemFactory.HUGE_BEAN_FLAT_TABLE_SCHEMA, 129 ScanResponse.builder() 130 .items(Arrays.asList(V2_ITEM_FACTORY.hugeFlat(), 131 V2_ITEM_FACTORY.hugeFlat(), 132 V2_ITEM_FACTORY.hugeFlat())) 133 .build(), 134 135 V1ItemFactory.V1HugeBeanFlat.class, 136 new ScanResult().withItems( 137 Arrays.asList(V1_ITEM_FACTORY.hugeFlat(), V1_ITEM_FACTORY.hugeFlat(), V1_ITEM_FACTORY.hugeFlat())) 138 ), 139 ; 140 141 // V2 142 private TableSchema<?> schema; 143 private ScanResponse v2Response; 144 145 // V1 146 private Class<?> v1BeanClass; 147 private ScanResult v1Response; 148 TestItem(TableSchema<?> schema, ScanResponse v2Response, Class<?> v1BeanClass, ScanResult v1Response)149 TestItem(TableSchema<?> schema, 150 ScanResponse v2Response, 151 152 Class<?> v1BeanClass, 153 ScanResult v1Response) { 154 this.schema = schema; 155 this.v2Response = v2Response; 156 157 this.v1BeanClass = v1BeanClass; 158 this.v1Response = v1Response; 159 } 160 getV1BeanClass()161 public Class<?> getV1BeanClass() { 162 return v1BeanClass; 163 } 164 } 165 } 166 } 167