Skip to content

Commit 16fa9e5

Browse files
remove put get and add batch put get
1 parent 3746e6d commit 16fa9e5

File tree

1 file changed

+53
-46
lines changed

1 file changed

+53
-46
lines changed

db-esdk-performance-testing/go/benchmark/benchmark_tests.go

Lines changed: 53 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"runtime"
1111
"runtime/metrics"
1212
"sort"
13+
"strconv"
1314
"sync"
1415
"time"
1516

@@ -21,65 +22,71 @@ import (
2122

2223
// === Helper Functions ===
2324

24-
// runPutGetCycle performs a single PutItem-GetItem cycle and measures performance
25-
func (b *DBESDKBenchmark) runPutGetCycle(data []byte, itemId string) (float64, float64, error) {
25+
// runBatchPutGetCycle performs a BatchWriteItem-BatchGetItem cycle with 25 items and measures performance
26+
func (b *DBESDKBenchmark) runBatchPutGetCycle(data []byte, baseItemId string) (float64, float64, error) {
2627
ctx := context.Background()
2728
tableName := b.Config.TableName
2829

29-
// Create DynamoDB item with test data
30-
item := map[string]types.AttributeValue{
31-
"partition_key": &types.AttributeValueMemberS{Value: "benchmark-test"},
32-
"sort_key": &types.AttributeValueMemberN{Value: itemId},
33-
"attribute1": &types.AttributeValueMemberB{Value: data}, // Store test data as binary
34-
"attribute2": &types.AttributeValueMemberS{Value: "sign me!"},
35-
":attribute3": &types.AttributeValueMemberS{Value: "ignore me!"},
30+
// Create 25 write requests with same data, different sort_key
31+
var writeRequests []types.WriteRequest
32+
for i := 0; i < 25; i++ {
33+
item := map[string]types.AttributeValue{
34+
"partition_key": &types.AttributeValueMemberS{Value: "benchmark-test"},
35+
"sort_key": &types.AttributeValueMemberN{Value: strconv.Itoa(i)},
36+
"attribute1": &types.AttributeValueMemberB{Value: data},
37+
"attribute2": &types.AttributeValueMemberS{Value: "sign me!"},
38+
":attribute3": &types.AttributeValueMemberS{Value: "ignore me!"},
39+
}
40+
writeRequests = append(writeRequests, types.WriteRequest{
41+
PutRequest: &types.PutRequest{Item: item},
42+
})
3643
}
3744

38-
// PutItem
39-
putStart := time.Now()
40-
putInput := &dynamodb.PutItemInput{
41-
TableName: aws.String(tableName),
42-
Item: item,
43-
}
44-
_, err := b.DbesdkClient.PutItem(ctx, putInput)
45+
// BatchWriteItem
46+
batchWriteStart := time.Now()
47+
_, err := b.DbesdkClient.BatchWriteItem(ctx, &dynamodb.BatchWriteItemInput{
48+
RequestItems: map[string][]types.WriteRequest{tableName: writeRequests},
49+
})
4550
if err != nil {
46-
return 0, 0, fmt.Errorf("PutItem failed: %w", err)
51+
return 0, 0, fmt.Errorf("BatchWriteItem failed: %w", err)
4752
}
48-
putDuration := time.Since(putStart).Seconds() * 1000
49-
50-
// GetItem
51-
key := map[string]types.AttributeValue{
52-
"partition_key": &types.AttributeValueMemberS{Value: "benchmark-test"},
53-
"sort_key": &types.AttributeValueMemberN{Value: itemId},
53+
batchWriteDuration := time.Since(batchWriteStart).Seconds() * 1000
54+
55+
// Create 25 keys for BatchGetItem
56+
var keys []map[string]types.AttributeValue
57+
for i := 0; i < 25; i++ {
58+
keys = append(keys, map[string]types.AttributeValue{
59+
"partition_key": &types.AttributeValueMemberS{Value: "benchmark-test"},
60+
"sort_key": &types.AttributeValueMemberN{Value: strconv.Itoa(i)},
61+
})
5462
}
5563

56-
getStart := time.Now()
57-
getInput := &dynamodb.GetItemInput{
58-
TableName: aws.String(tableName),
59-
Key: key,
60-
ConsistentRead: aws.Bool(true),
61-
}
62-
result, err := b.DbesdkClient.GetItem(ctx, getInput)
64+
// BatchGetItem
65+
batchGetStart := time.Now()
66+
result, err := b.DbesdkClient.BatchGetItem(ctx, &dynamodb.BatchGetItemInput{
67+
RequestItems: map[string]types.KeysAndAttributes{
68+
tableName: {Keys: keys, ConsistentRead: aws.Bool(true)},
69+
},
70+
})
6371
if err != nil {
64-
return 0, 0, fmt.Errorf("GetItem failed: %w", err)
72+
return 0, 0, fmt.Errorf("BatchGetItem failed: %w", err)
6573
}
66-
getDuration := time.Since(getStart).Seconds() * 1000
74+
batchGetDuration := time.Since(batchGetStart).Seconds() * 1000
6775

68-
// Verify data integrity
69-
if result.Item == nil {
70-
return 0, 0, fmt.Errorf("item not found")
76+
// Verify 25 items retrieved with correct data size
77+
items := result.Responses[tableName]
78+
if len(items) != 25 {
79+
return 0, 0, fmt.Errorf("expected 25 items, got %d", len(items))
7180
}
7281

73-
retrievedData, ok := result.Item["attribute1"].(*types.AttributeValueMemberB)
74-
if !ok {
75-
return 0, 0, fmt.Errorf("attribute1 not found or wrong type")
76-
}
77-
78-
if len(retrievedData.Value) != len(data) {
79-
return 0, 0, fmt.Errorf("data size mismatch: expected %d, got %d", len(data), len(retrievedData.Value))
82+
for _, item := range items {
83+
retrievedData, ok := item["attribute1"].(*types.AttributeValueMemberB)
84+
if !ok || len(retrievedData.Value) != len(data) {
85+
return 0, 0, fmt.Errorf("data verification failed")
86+
}
8087
}
8188

82-
return putDuration, getDuration, nil
89+
return batchWriteDuration, batchGetDuration, nil
8390
}
8491

8592
// shouldRunTestType checks if a test type should be run based on quick config
@@ -107,7 +114,7 @@ func (b *DBESDKBenchmark) runThroughputTest(dataSize int, iterations int) (*Benc
107114
// Warmup
108115
for i := 0; i < b.Config.Iterations.Warmup; i++ {
109116
itemId := fmt.Sprintf("%d", i) // Use numeric string for Number attribute
110-
if _, _, err := b.runPutGetCycle(testData, itemId); err != nil {
117+
if _, _, err := b.runBatchPutGetCycle(testData, itemId); err != nil {
111118
return nil, fmt.Errorf("warmup iteration %d failed: %w", i, err)
112119
}
113120
}
@@ -126,7 +133,7 @@ func (b *DBESDKBenchmark) runThroughputTest(dataSize int, iterations int) (*Benc
126133
for i := 0; i < iterations; i++ {
127134
itemId := fmt.Sprintf("%d", 1000+i) // Use numeric string, offset to avoid warmup conflicts
128135
iterationStart := time.Now()
129-
putMs, getMs, err := b.runPutGetCycle(testData, itemId)
136+
putMs, getMs, err := b.runBatchPutGetCycle(testData, itemId)
130137
if err != nil {
131138
return nil, fmt.Errorf("measurement iteration %d failed: %w", i, err)
132139
}
@@ -244,7 +251,7 @@ func (b *DBESDKBenchmark) runMemoryTest(dataSize int) (*BenchmarkResult, error)
244251
// Run operation
245252
operationStart := time.Now()
246253
itemId := fmt.Sprintf("%d", 2000+i) // Use numeric string, offset to avoid conflicts
247-
_, _, err := b.runPutGetCycle(data, itemId)
254+
_, _, err := b.runBatchPutGetCycle(data, itemId)
248255
operationDuration := time.Since(operationStart)
249256

250257
close(stopSampling)

0 commit comments

Comments
 (0)