Skip to content

Commit be3eb1b

Browse files
committed
DDB Enhanced Client: Added v1/v2 performance comparison tests for all basic operations
1 parent 8778f33 commit be3eb1b

22 files changed

+2112
-83
lines changed

test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/BenchmarkRunner.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,14 @@
3636
import software.amazon.awssdk.benchmark.apicall.protocol.XmlProtocolBenchmark;
3737
import software.amazon.awssdk.benchmark.coldstart.V2DefaultClientCreationBenchmark;
3838
import software.amazon.awssdk.benchmark.coldstart.V2OptimizedClientCreationBenchmark;
39+
import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientDeleteV1MapperComparisonBenchmark;
3940
import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientGetOverheadBenchmark;
41+
import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientGetV1MapperComparisonBenchmark;
4042
import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientPutOverheadBenchmark;
41-
import software.amazon.awssdk.benchmark.enhanced.dynamodb.V1MapperComparisonBenchmark;
43+
import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientPutV1MapperComparisonBenchmark;
44+
import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientQueryV1MapperComparisonBenchmark;
45+
import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientScanV1MapperComparisonBenchmark;
46+
import software.amazon.awssdk.benchmark.enhanced.dynamodb.EnhancedClientUpdateV1MapperComparisonBenchmark;
4247
import software.amazon.awssdk.utils.Logger;
4348

4449

@@ -64,7 +69,12 @@ public class BenchmarkRunner {
6469
private static final List<String> MAPPER_BENCHMARKS = Arrays.asList(
6570
EnhancedClientGetOverheadBenchmark.class.getSimpleName(),
6671
EnhancedClientPutOverheadBenchmark.class.getSimpleName(),
67-
V1MapperComparisonBenchmark.class.getSimpleName()
72+
EnhancedClientGetV1MapperComparisonBenchmark.class.getSimpleName(),
73+
EnhancedClientPutV1MapperComparisonBenchmark.class.getSimpleName(),
74+
EnhancedClientUpdateV1MapperComparisonBenchmark.class.getSimpleName(),
75+
EnhancedClientDeleteV1MapperComparisonBenchmark.class.getSimpleName(),
76+
EnhancedClientScanV1MapperComparisonBenchmark.class.getSimpleName(),
77+
EnhancedClientQueryV1MapperComparisonBenchmark.class.getSimpleName()
6878
);
6979

7080
private static final Logger log = Logger.loggerFor(BenchmarkRunner.class);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
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 org.openjdk.jmh.annotations.Benchmark;
21+
import org.openjdk.jmh.annotations.BenchmarkMode;
22+
import org.openjdk.jmh.annotations.Fork;
23+
import org.openjdk.jmh.annotations.Measurement;
24+
import org.openjdk.jmh.annotations.Mode;
25+
import org.openjdk.jmh.annotations.Param;
26+
import org.openjdk.jmh.annotations.Scope;
27+
import org.openjdk.jmh.annotations.Setup;
28+
import org.openjdk.jmh.annotations.State;
29+
import org.openjdk.jmh.annotations.Warmup;
30+
import org.openjdk.jmh.infra.Blackhole;
31+
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
32+
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
33+
import software.amazon.awssdk.enhanced.dynamodb.Key;
34+
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
35+
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
36+
37+
@BenchmarkMode(Mode.Throughput)
38+
@Warmup(iterations = 5)
39+
@Measurement(iterations = 5)
40+
@Fork(2)
41+
@State(Scope.Benchmark)
42+
public class EnhancedClientDeleteV1MapperComparisonBenchmark {
43+
@Benchmark
44+
public void v2Delete(TestState s) {
45+
s.v2Table.deleteItem(s.key);
46+
}
47+
48+
@Benchmark
49+
public void v1Delete(TestState s) {
50+
s.v1DdbMapper.delete(s.testItem.v1Key);
51+
}
52+
53+
private static DynamoDbClient getV2Client(Blackhole bh) {
54+
return new V2TestDynamoDbDeleteItemClient(bh);
55+
}
56+
57+
private static AmazonDynamoDB getV1Client(Blackhole bh) {
58+
return new V1TestDynamoDbDeleteItemClient(bh);
59+
}
60+
61+
@State(Scope.Benchmark)
62+
public static class TestState {
63+
@Param({"TINY", "SMALL", "HUGE", "HUGE_FLAT"})
64+
public TestItem testItem;
65+
66+
private final Key key = Key.builder().partitionValue("key").build();
67+
68+
private DynamoDbTable v2Table;
69+
private DynamoDBMapper v1DdbMapper;
70+
71+
72+
@Setup
73+
public void setup(Blackhole bh) {
74+
DynamoDbEnhancedClient v2DdbEnh = DynamoDbEnhancedClient.builder()
75+
.dynamoDbClient(getV2Client(bh))
76+
.build();
77+
78+
v2Table = v2DdbEnh.table(testItem.name(), testItem.schema);
79+
80+
v1DdbMapper = new DynamoDBMapper(getV1Client(bh));
81+
}
82+
83+
public enum TestItem {
84+
TINY(
85+
V2ItemFactory.TINY_BEAN_TABLE_SCHEMA,
86+
new V1ItemFactory.V1TinyBean("hashKey")
87+
),
88+
89+
SMALL(
90+
V2ItemFactory.SMALL_BEAN_TABLE_SCHEMA,
91+
new V1ItemFactory.V1SmallBean("hashKey")
92+
),
93+
94+
HUGE(
95+
V2ItemFactory.HUGE_BEAN_TABLE_SCHEMA,
96+
new V1ItemFactory.V1HugeBean("hashKey")
97+
98+
),
99+
100+
HUGE_FLAT(
101+
V2ItemFactory.HUGE_BEAN_FLAT_TABLE_SCHEMA,
102+
new V1ItemFactory.V1HugeBeanFlat("hashKey")
103+
),
104+
;
105+
106+
// V2
107+
private TableSchema schema;
108+
109+
// V1
110+
private Object v1Key;
111+
112+
TestItem(TableSchema<?> schema,
113+
Object v1Key) {
114+
this.schema = schema;
115+
116+
this.v1Key = v1Key;
117+
}
118+
}
119+
}
120+
}
Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
@Measurement(iterations = 5)
4242
@Fork(2)
4343
@State(Scope.Benchmark)
44-
public class V1MapperComparisonBenchmark {
44+
public class EnhancedClientGetV1MapperComparisonBenchmark {
4545
private static final V2ItemFactory V2_ITEM_FACTORY = new V2ItemFactory();
4646
private static final V1ItemFactory V1_ITEM_FACTORY = new V1ItemFactory();
4747

@@ -55,22 +55,12 @@ public Object v1Get(TestState s) {
5555
return s.v1DdbMapper.load(s.testItem.v1Key);
5656
}
5757

58-
@Benchmark
59-
public void v2Put(TestState s) {
60-
s.v2Table.putItem(s.testItem.v2Bean);
61-
}
62-
63-
@Benchmark
64-
public void v1Put(TestState s) {
65-
s.v1DdbMapper.save(s.testItem.v1Bean);
66-
}
67-
6858
private static DynamoDbClient getV2Client(Blackhole bh, GetItemResponse getItemResponse) {
69-
return new V2TestDynamoDbClient(bh, getItemResponse);
59+
return new V2TestDynamoDbGetItemClient(bh, getItemResponse);
7060
}
7161

7262
private static AmazonDynamoDB getV1Client(Blackhole bh, GetItemResult getItemResult) {
73-
return new V1TestDynamoDbClient(bh, getItemResult);
63+
return new V1TestDynamoDbGetItemClient(bh, getItemResult);
7464
}
7565

7666
@State(Scope.Benchmark)
@@ -80,7 +70,7 @@ public static class TestState {
8070

8171
private final Key key = Key.builder().partitionValue("key").build();
8272

83-
private DynamoDbTable v2Table;
73+
private DynamoDbTable<?> v2Table;
8474
private DynamoDBMapper v1DdbMapper;
8575

8676

@@ -99,68 +89,54 @@ public enum TestItem {
9989
TINY(
10090
V2ItemFactory.TINY_BEAN_TABLE_SCHEMA,
10191
GetItemResponse.builder().item(V2_ITEM_FACTORY.tiny()).build(),
102-
V2_ITEM_FACTORY.tinyBean(),
10392

10493
new V1ItemFactory.V1TinyBean("hashKey"),
105-
new GetItemResult().withItem(V1_ITEM_FACTORY.tiny()),
106-
V1_ITEM_FACTORY.v1TinyBean()
94+
new GetItemResult().withItem(V1_ITEM_FACTORY.tiny())
10795
),
10896

10997
SMALL(
11098
V2ItemFactory.SMALL_BEAN_TABLE_SCHEMA,
11199
GetItemResponse.builder().item(V2_ITEM_FACTORY.small()).build(),
112-
V2_ITEM_FACTORY.smallBean(),
113100

114101
new V1ItemFactory.V1SmallBean("hashKey"),
115-
new GetItemResult().withItem(V1_ITEM_FACTORY.small()),
116-
V1_ITEM_FACTORY.v1SmallBean()
102+
new GetItemResult().withItem(V1_ITEM_FACTORY.small())
117103
),
118104

119105
HUGE(
120106
V2ItemFactory.HUGE_BEAN_TABLE_SCHEMA,
121107
GetItemResponse.builder().item(V2_ITEM_FACTORY.huge()).build(),
122-
V2_ITEM_FACTORY.hugeBean(),
123108

124109
new V1ItemFactory.V1HugeBean("hashKey"),
125-
new GetItemResult().withItem(V1_ITEM_FACTORY.huge()),
126-
V1_ITEM_FACTORY.v1hugeBean()
110+
new GetItemResult().withItem(V1_ITEM_FACTORY.huge())
127111
),
128112

129113
HUGE_FLAT(
130114
V2ItemFactory.HUGE_BEAN_FLAT_TABLE_SCHEMA,
131115
GetItemResponse.builder().item(V2_ITEM_FACTORY.hugeFlat()).build(),
132-
V2_ITEM_FACTORY.hugeBeanFlat(),
133116

134117
new V1ItemFactory.V1HugeBeanFlat("hashKey"),
135-
new GetItemResult().withItem(V1_ITEM_FACTORY.hugeFlat()),
136-
V1_ITEM_FACTORY.v1HugeBeanFlat()
118+
new GetItemResult().withItem(V1_ITEM_FACTORY.hugeFlat())
137119
),
138120
;
139121

140122
// V2
141-
private TableSchema schema;
123+
private TableSchema<?> schema;
142124
private GetItemResponse v2Response;
143-
private Object v2Bean;
144125

145126
// V1
146127
private Object v1Key;
147128
private GetItemResult v1Response;
148-
private Object v1Bean;
149129

150130
TestItem(TableSchema<?> schema,
151131
GetItemResponse v2Response,
152-
Object v2Bean,
153132

154133
Object v1Key,
155-
GetItemResult v1Response,
156-
Object v1Bean) {
134+
GetItemResult v1Response) {
157135
this.schema = schema;
158136
this.v2Response = v2Response;
159-
this.v2Bean = v2Bean;
160137

161138
this.v1Key = v1Key;
162139
this.v1Response = v1Response;
163-
this.v1Bean = v1Bean;
164140
}
165141
}
166142
}

0 commit comments

Comments
 (0)