mirror of
https://github.com/golang/go
synced 2024-11-06 13:36:12 -07:00
runtime: do not alloc never used tail bytes in fixalloc
Currently, the '_FixAllocChunk % fixalloc.size' tail bytes
will never be used when allocing from persistentalloc.
Wasted bytes on darwin/amd64:
_FixAllocChunk % mheap_.spanalloc.size = 64
_FixAllocChunk % mheap_.cachealloc.size = 784
_FixAllocChunk % mheap_.specialfinalizeralloc.size = 16
_FixAllocChunk % mheap_.specialprofilealloc.size = 16
_FixAllocChunk % mheap_.specialReachableAlloc.size = 16
_FixAllocChunk % mheap_.arenaHintAlloc.size = 16
After this commit, fixalloc alloc '_FixAllocChunk / fixalloc.size'
objects exactly with zero waste. Sizeof(fixalloc{}) is unchanged.
Change-Id: Ifc551f5b7aa9d842fa559abbe532ffcfb4d3540c
GitHub-Last-Rev: e08b4c66b8
GitHub-Pull-Request: golang/go#47439
Reviewed-on: https://go-review.googlesource.com/c/go/+/338090
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Cherry Mui <cherryyz@google.com>
This commit is contained in:
parent
a35c5c98c0
commit
4591f49938
@ -30,7 +30,8 @@ type fixalloc struct {
|
|||||||
arg unsafe.Pointer
|
arg unsafe.Pointer
|
||||||
list *mlink
|
list *mlink
|
||||||
chunk uintptr // use uintptr instead of unsafe.Pointer to avoid write barriers
|
chunk uintptr // use uintptr instead of unsafe.Pointer to avoid write barriers
|
||||||
nchunk uint32
|
nchunk uint32 // bytes remaining in current chunk
|
||||||
|
nalloc uint32 // size of new chunks in bytes
|
||||||
inuse uintptr // in-use bytes now
|
inuse uintptr // in-use bytes now
|
||||||
stat *sysMemStat
|
stat *sysMemStat
|
||||||
zero bool // zero allocations
|
zero bool // zero allocations
|
||||||
@ -63,6 +64,7 @@ func (f *fixalloc) init(size uintptr, first func(arg, p unsafe.Pointer), arg uns
|
|||||||
f.list = nil
|
f.list = nil
|
||||||
f.chunk = 0
|
f.chunk = 0
|
||||||
f.nchunk = 0
|
f.nchunk = 0
|
||||||
|
f.nalloc = uint32(_FixAllocChunk / size * size) // Round _FixAllocChunk down to an exact multiple of size to eliminate tail waste
|
||||||
f.inuse = 0
|
f.inuse = 0
|
||||||
f.stat = stat
|
f.stat = stat
|
||||||
f.zero = true
|
f.zero = true
|
||||||
@ -84,8 +86,8 @@ func (f *fixalloc) alloc() unsafe.Pointer {
|
|||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
if uintptr(f.nchunk) < f.size {
|
if uintptr(f.nchunk) < f.size {
|
||||||
f.chunk = uintptr(persistentalloc(_FixAllocChunk, 0, f.stat))
|
f.chunk = uintptr(persistentalloc(uintptr(f.nalloc), 0, f.stat))
|
||||||
f.nchunk = _FixAllocChunk
|
f.nchunk = f.nalloc
|
||||||
}
|
}
|
||||||
|
|
||||||
v := unsafe.Pointer(f.chunk)
|
v := unsafe.Pointer(f.chunk)
|
||||||
|
Loading…
Reference in New Issue
Block a user