You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Go is a garbage collected environment. This is great for correctness, but it can lead to substantial perf
issues. Allocating memory is by no means free and should be done carefully. We want to minimize the
occurrence of garbage collection and reduce the amount of work the GC is asked to perform.
Reuse and object pools
Preallocate memory and reuse it over and over again. This not only reduces strain on the GC, it also results
in considerably better CPU cache and TLB efficiency which can make your code 10x faster. The Go
sync.Pool type can be useful here.
Avoid pointers when you can
Having distinct objects in memory is inherently expensive:
You need at least 8 bytes to point to the object
There is hidden overhead associated with each object (probably between 8 to 16 bytes per object)
Writing to references tends to be more expensive due to GC write barriers
Programmers coming from Java aren't used to this distinction since Java doesn't have
general support for value types and thus everything is an object and pointers
abound. But Go does have good value semantics, so we use them.
Goroutines are said to be cheap, but they need to be used judiciously otherwise performance will suffer.
Don’t create goroutines in the main request serving path. Prefer to create them a priori and have them wait for input.
Measuring
Human beings have proven incapable of predicting the real-world performance of complex systems. Performance tuning should therefore follow the rule of the three Ms: