On Saturday, June 12, 2021 at 12:04:21 PM UTC-4 Ian Lance Taylor wrote:
> On Fri, Jun 11, 2021 at 11:21 PM tapi...@gmail.com <tapi...@gmail.com> > wrote: > > > > It looks the _PageSize constant used in allocating large memory block is > declared as 8192 in code, but os.Getpagesize() returns 4096. > > > > const ( > > ... > > _PageShift = 13 > > _PageSize = 1 << _PageShift > > ... > > ) > > > > Is this intended? > > Yes. _PageSize is the page size that the memory allocator uses. > os.Getpagesize returns the page size that the system uses to map > pages. In the runtime that is known as physPageSize. There is no > necessary relationship between the two, although heapArenaBytes should > be a multiple of both. > > Ian > Thanks for the clarification. > > > On Friday, June 11, 2021 at 7:59:27 PM UTC-4 tapi...@gmail.com wrote: > >> > >> On Friday, June 11, 2021 at 2:00:03 PM UTC-4 Ian Lance Taylor wrote: > >>> > >>> On Fri, Jun 11, 2021 at 9:38 AM tapi...@gmail.com <tapi...@gmail.com> > wrote: > >>> > > >>> > package allocate > >>> > > >>> > import "testing" > >>> > import "os" > >>> > import "fmt" > >>> > > >>> > func init() { > >>> > fmt.Println("OS page size:", os.Getpagesize()) > >>> > } > >>> > > >>> > var r1 []byte > >>> > > >>> > func BenchmarkCount1(b *testing.B) { > >>> > for i := 0; i < b.N; i++ { > >>> > r1 = make([]byte, 32768+1) > >>> > } > >>> > } > >>> > > >>> > var r2 []byte > >>> > > >>> > func BenchmarkCount2(b *testing.B) { > >>> > for i := 0; i < b.N; i++ { > >>> > r2 = make([]byte, 40) > >>> > } > >>> > } > >>> > > >>> > The output: > >>> > > >>> > OS page size: 32768 > >>> > BenchmarkCount1-4 166443 7312 ns/op 40960 B/op 1 allocs/op > >>> > BenchmarkCount2-4 31465389 36.88 ns/op 48 B/op 1 allocs/op > >>> > > >>> > In fact, a memory block with size 36864 is enough to carry the > elements of a byte slice with size 32768+1. Why to allocate one more page > for them? > >>> > >>> Memory blocks larger than 32768 bytes flip over to the "large > >>> allocation" model. See _MaxSmallSize in runtime/sizeclasses.go (a > >>> generated file). This requires an extra span. I haven't tried to > >>> work it out in detail, but it probably has something to do with that. > >>> > >>> Ian > >> > >> > >> Yes, that is why I chose a size 32768+1. > >> I understand that the large memory block will be a multiple of page > size. > >> What I haven't get is why one more page is allocated. > >> > >> I will try to read the source to get the answer. > >> > >> BTW, sorry, I missed a "more" in the thread title. > > > > -- > > You received this message because you are subscribed to the Google > Groups "golang-nuts" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to golang-nuts...@googlegroups.com. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/76e112a7-9e1a-46ed-bcb3-03c0ff33beacn%40googlegroups.com. > > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/72602056-1533-4103-8e0f-d27a47e7e5f7n%40googlegroups.com.