@@ -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