• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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