diff --git a/.changelog/bf2d083eb544421e9c0542e73951e635.json b/.changelog/bf2d083eb544421e9c0542e73951e635.json new file mode 100644 index 00000000..e2c4f0a9 --- /dev/null +++ b/.changelog/bf2d083eb544421e9c0542e73951e635.json @@ -0,0 +1,8 @@ +{ + "id": "bf2d083e-b544-421e-9c05-42e73951e635", + "type": "bugfix", + "description": "Adjust the initial sizes of each middleware phase to avoid some unnecessary reallocation.", + "modules": [ + "." + ] +} \ No newline at end of file diff --git a/middleware/ordered_group.go b/middleware/ordered_group.go index 4b195308..daf90136 100644 --- a/middleware/ordered_group.go +++ b/middleware/ordered_group.go @@ -23,12 +23,14 @@ type orderedIDs struct { items map[string]ider } -const baseOrderedItems = 5 +// selected based on the general upper bound of # of middlewares in each step +// in the downstream aws-sdk-go-v2 +const baseOrderedItems = 8 -func newOrderedIDs() *orderedIDs { +func newOrderedIDs(cap int) *orderedIDs { return &orderedIDs{ - order: newRelativeOrder(), - items: make(map[string]ider, baseOrderedItems), + order: newRelativeOrder(cap), + items: make(map[string]ider, cap), } } @@ -141,9 +143,9 @@ type relativeOrder struct { order []string } -func newRelativeOrder() *relativeOrder { +func newRelativeOrder(cap int) *relativeOrder { return &relativeOrder{ - order: make([]string, 0, baseOrderedItems), + order: make([]string, 0, cap), } } diff --git a/middleware/ordered_group_test.go b/middleware/ordered_group_test.go index 3c6f6a02..d0c7a77b 100644 --- a/middleware/ordered_group_test.go +++ b/middleware/ordered_group_test.go @@ -6,7 +6,7 @@ import ( ) func TestOrderedIDsAdd(t *testing.T) { - o := newOrderedIDs() + o := newOrderedIDs(10) noError(t, o.Add(&mockIder{"first"}, After)) noError(t, o.Add(&mockIder{"second"}, After)) @@ -31,7 +31,7 @@ func TestOrderedIDsAdd(t *testing.T) { } func TestOrderedIDsInsert(t *testing.T) { - o := newOrderedIDs() + o := newOrderedIDs(10) noError(t, o.Add(&mockIder{"first"}, After)) noError(t, o.Insert(&mockIder{"third"}, "first", After)) @@ -63,7 +63,7 @@ func TestOrderedIDsInsert(t *testing.T) { } func TestOrderedIDsGet(t *testing.T) { - o := newOrderedIDs() + o := newOrderedIDs(10) noError(t, o.Add(&mockIder{"first"}, After)) noError(t, o.Add(&mockIder{"second"}, After)) @@ -83,7 +83,7 @@ func TestOrderedIDsGet(t *testing.T) { } func TestOrderedIDsSwap(t *testing.T) { - o := newOrderedIDs() + o := newOrderedIDs(10) noError(t, o.Add(&mockIder{"first"}, After)) noError(t, o.Add(&mockIder{"second"}, After)) @@ -119,7 +119,7 @@ func TestOrderedIDsSwap(t *testing.T) { } func TestOrderedIDsRemove(t *testing.T) { - o := newOrderedIDs() + o := newOrderedIDs(10) firstIder := &mockIder{"first"} noError(t, o.Add(firstIder, After)) noError(t, o.Insert(&mockIder{"third"}, "first", After)) @@ -144,7 +144,7 @@ func TestOrderedIDsRemove(t *testing.T) { } func TestOrderedIDsClear(t *testing.T) { - o := newOrderedIDs() + o := newOrderedIDs(10) noError(t, o.Add(&mockIder{"first"}, After)) noError(t, o.Add(&mockIder{"second"}, After)) @@ -161,7 +161,7 @@ func TestOrderedIDsClear(t *testing.T) { } func TestOrderedIDsGetOrder(t *testing.T) { - o := newOrderedIDs() + o := newOrderedIDs(10) noError(t, o.Add(&mockIder{"first"}, After)) noError(t, o.Add(&mockIder{"second"}, After)) diff --git a/middleware/step_build.go b/middleware/step_build.go index 7e1d94ca..cc7fe89c 100644 --- a/middleware/step_build.go +++ b/middleware/step_build.go @@ -79,7 +79,7 @@ type BuildStep struct { // initialization added to it. func NewBuildStep() *BuildStep { return &BuildStep{ - ids: newOrderedIDs(), + ids: newOrderedIDs(baseOrderedItems), } } diff --git a/middleware/step_deserialize.go b/middleware/step_deserialize.go index 44860721..9a6679a5 100644 --- a/middleware/step_deserialize.go +++ b/middleware/step_deserialize.go @@ -85,7 +85,8 @@ type DeserializeStep struct { // initialization added to it. func NewDeserializeStep() *DeserializeStep { return &DeserializeStep{ - ids: newOrderedIDs(), + // downstream SDK typically has larger Deserialize step + ids: newOrderedIDs(baseOrderedItems * 2), } } diff --git a/middleware/step_finalize.go b/middleware/step_finalize.go index 065e3885..76eab249 100644 --- a/middleware/step_finalize.go +++ b/middleware/step_finalize.go @@ -79,7 +79,8 @@ type FinalizeStep struct { // initialization added to it. func NewFinalizeStep() *FinalizeStep { return &FinalizeStep{ - ids: newOrderedIDs(), + // downstream SDK typically has larger Finalize step + ids: newOrderedIDs(baseOrderedItems * 2), } } diff --git a/middleware/step_initialize.go b/middleware/step_initialize.go index fe359144..312be3a3 100644 --- a/middleware/step_initialize.go +++ b/middleware/step_initialize.go @@ -79,7 +79,7 @@ type InitializeStep struct { // initialization added to it. func NewInitializeStep() *InitializeStep { return &InitializeStep{ - ids: newOrderedIDs(), + ids: newOrderedIDs(baseOrderedItems), } } diff --git a/middleware/step_serialize.go b/middleware/step_serialize.go index 114bafce..a4ce4bee 100644 --- a/middleware/step_serialize.go +++ b/middleware/step_serialize.go @@ -85,7 +85,7 @@ type SerializeStep struct { // serialize the input parameters into. func NewSerializeStep(newRequest func() interface{}) *SerializeStep { return &SerializeStep{ - ids: newOrderedIDs(), + ids: newOrderedIDs(baseOrderedItems), newRequest: newRequest, } }