mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: simpler and faster GC
Implement the design described in: https://docs.google.com/document/d/1v4Oqa0WwHunqlb8C3ObL_uNQw3DfSY-ztoA-4wWbKcg/pub Summary of the changes: GC uses "2-bits per word" pointer type info embed directly into bitmap. Scanning of stacks/data/heap is unified. The old spans types go away. Compiler generates "sparse" 4-bits type info for GC (directly for GC bitmap). Linker generates "dense" 2-bits type info for data/bss (the same as stacks use). Summary of results: -1680 lines of code total (-1000+ in mgc0.c only) -25% memory consumption -3-7% binary size -15% GC pause reduction -7% run time reduction LGTM=khr R=golang-codereviews, rsc, christoph, khr CC=golang-codereviews, rlh https://golang.org/cl/106260045
This commit is contained in:
parent
0100afbdcc
commit
cd17a717f9
27 changed files with 1632 additions and 2413 deletions
|
|
@ -68,6 +68,19 @@ func BenchmarkMallocTypeInfo16(b *testing.B) {
|
|||
mallocSink = x
|
||||
}
|
||||
|
||||
type LargeStruct struct {
|
||||
x [16][]byte
|
||||
}
|
||||
|
||||
func BenchmarkMallocLargeStruct(b *testing.B) {
|
||||
var x uintptr
|
||||
for i := 0; i < b.N; i++ {
|
||||
p := make([]LargeStruct, 2)
|
||||
x ^= uintptr(unsafe.Pointer(&p[0]))
|
||||
}
|
||||
mallocSink = x
|
||||
}
|
||||
|
||||
var n = flag.Int("n", 1000, "number of goroutines")
|
||||
|
||||
func BenchmarkGoroutineSelect(b *testing.B) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue