Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
Untriaged
-
1
-
Unknown
Description
plasma.go constructors New(), New2(), New3() all accept argument cfg Config, which is a struct, therefore it is being passed by value not by reference. This means each call, and each child this is passed to that does the same thing, makes a new shallow copy of the entire Config struct. By my count this struct currently contains 113 fields, so these copies are doing a lot of extra CPU work and consuming significant stack.
E.g. a call to New(cfg) triggers the following copies (at least the first 5, and possibly up to 7, assuming none of the great-grandchildren copy it further):
- New(cfg) – arg copied on call
- New2(cfg, ...) – copied to child call
- New3(cfg, ...) – copied to grandchild call
- applyConfigDefaults(cfg, ...) – copied to first great-grandchild call
- cfg = applyConfigDefaults(...) – and copied again assigning the returned copy back to New3's cfg variable
- doRecovery(..., cfg, ...) – copied to second great-grandchild if this call is made
- newPlasmaSkeleton(cfg, ...) – copied to third great-grandchild if this call is made
This is only called once per instance created. It does not happen very often. Having said that, we could pass in pointer and do the copy until the very last one. Not sure how much CPU it will actually saved though.