CompilerOptimizations
Pages 127
- Home
- Articles
- Benchmarks
- Blogs
- Books
- BoundingResourceUse
- cgo
- ChromeOS
- CodeReview
- CodeReviewComments
- CodeTools
- Comments
- CommonMistakes
- CompilerOptimizations
- Conferences
- CoreDumpDebugging
- Courses
- CustomPprofProfiles
- Darwin
- DashboardBuilders
- DesignDocuments
- DevExp
- Diagnostics
- DragonFly BSD
- Errors
- ExperienceReports
- FileTreeDocumentation
- FreeBSD
- FromXToGo
- Gardening
- GccgoCrossCompilation
- GcToolchainTricks
- GerritAccess
- GithubAccess
- GitHubCodeLayout
- Go 1.6 release party
- Go 1.8 Release Party
- Go Release Cycle
- Go1point1Gotchas
- GoArm
- GoForCPPProgrammers
- GoGenerateTools
- GoGetProxyConfig
- GoGetTools
- Gomote
- GOPATH
- Gopher
- GoStrings
- GoTalks
- GoUserGroups
- GoUsers
- GoVsGenerics
- HandlingIssues
- Hashing
- heapdump13
- heapdump14
- heapdump15
- HostedContinuousIntegration
- HowToAsk
- HttpFetch
- HttpStaticFiles
- IDEsAndTextEditorPlugins
- InstallFromSource
- InstallTroubleshooting
- InterfaceSlice
- Iota
- IssueLabels
- Learn
- LearnConcurrency
- LearnErrorHandling
- LearnServerProgramming
- LearnTesting
- Linux
- LockOSThread
- MethodSets
- MinimumRequirements
- Mobile
- MultipleGoRoots
- MutexOrChannel
- NativeClient
- NetBSD
- NoMeToo
- NonEnglish
- OlderVersions
- OpenBSD
- PackageManagementTools
- PackagePublishing
- PanicAndRecover
- PerfDashboard
- Performance
- Plan9
- Podcasts
- PortingPolicy
- PriorDiscussion
- Projects
- ProviderIntegration
- Questions
- RaceDetector
- Range
- RateLimiting
- Rationales
- ResearchPapers
- Screencasts
- SendingMail
- Setting GOPATH
- SettingGOPATH
- SignalHandling
- SimultaneousAssignment
- SliceTricks
- Solaris
- SQLDrivers
- SQLInterface
- Style
- SubRepositories
- SuccessStories
- Switch
- TableDrivenTests
- Timeouts
- Training
- Ubuntu
- WebAccessibilityResourcesAndTips
- Well known struct tags
- WhyGo
- WindowsBuild
- WindowsCrossCompiling
- WindowsDLLs
- WindowsSupport
- Show 112 more pages…
Clone this wiki locally
Compiler And Runtime Optimizations
This page lists optimizations done by the compilers. Note that these are not guaranteed by the language specification.
Interface values
Zero-width types in interface values
Putting a zero-width type in an interface value doesn't allocate.
- gc: 1.0+
- gccgo: ?
Word-sized value in an interface value
Putting a word-sized-or-less non-pointer type in an interface value doesn't allocate.
- gc: 1.0-1.3, but not in 1.4+
- gccgo: never
string and []byte
Map lookup by []byte
For a map m of type map[string]T and []byte b, m[string(b)] doesn't allocate. (the temporary string copy of the byte slice isn't made)
- gc: 1.4+
- gccgo: ?
range over []byte(s)
Avoiding allocating []byte of a string when ranging over the bytes:
s := "foo"
for i, c := range []byte(s) {
// ...
}- gc: 1.5+ (CL 3790)
- gccgo: ?
Escape analysis and Inlining
Use -gcflags -m to observe the result of escape analysis and inlining
decisions for the gc toolchain.
(TODO: explain the output of -gcflags -m).
Escape analysis
Gc compiler does global escape analysis across function and package boundaries. However, there are lots of cases where it gives up. For example, anything assigned to any kind of indirection (*p = ...) is considered escaped. Other things that can inhibit analysis are: function calls, package boundaries, slice literals, subslicing and indexing, etc. Full rules are too complex to describe, so check the -m output.
- gc: 1.0+
- gccgo: not yet.
Function Inlining
Only short and simple functions are inlined. To be inlined a function must contain less than ~40 expressions and does not contain complex things like function calls, loops, labels, closures, panic's, recover's, select's, switch'es, etc.
- gc: 1.0+
- gccgo: -O1 and above.
Idioms
Optimized memclr
For a slice or array s, loops of the form
for i := range s {
a[i] = <zero value for element of s>
}are converted into efficient runtime memclr calls. Issue and commit.
- gc: 1.5+
- gccgo: ?
Non-scannable objects
Garbage collector does not scan underlying buffers of slices, channels and maps when element type does not contain pointers (both key and value for maps). This allows to hold large data sets in memory without paying high price during garbage collection. For example, the following map won't visibly affect GC time:
type Key [64]byte // SHA-512 hash
type Value struct {
Name [32]byte
Balance uint64
Timestamp int64
}
m := make(map[Key]Value, 1e8)- gc: 1.5+
- gccgo: ?