runtime: inline MCache_Alloc() into mallocgc()

benchmark                    old ns/op    new ns/op    delta
BenchmarkMalloc8                    68           62   -8.63%
BenchmarkMalloc16                   75           69   -7.94%
BenchmarkMallocTypeInfo8           102           98   -3.73%
BenchmarkMallocTypeInfo16          108          103   -4.63%

R=golang-dev, dave, khr
CC=golang-dev
https://golang.org/cl/9790043
This commit is contained in:
Dmitriy Vyukov 2013-05-28 11:05:55 +04:00
parent 47e0a3d7b1
commit 5166013f75
3 changed files with 25 additions and 30 deletions

View file

@ -31,9 +31,10 @@ runtime·mallocgc(uintptr size, uint32 flag, int32 dogc, int32 zeroed)
int32 sizeclass;
intgo rate;
MCache *c;
MCacheList *l;
uintptr npages;
MSpan *s;
void *v;
MLink *v;
if(runtime·gcwaiting && g != m->g0 && m->locks == 0 && dogc)
runtime·gosched();
@ -56,9 +57,20 @@ runtime·mallocgc(uintptr size, uint32 flag, int32 dogc, int32 zeroed)
else
sizeclass = runtime·size_to_class128[(size-1024+127) >> 7];
size = runtime·class_to_size[sizeclass];
v = runtime·MCache_Alloc(c, sizeclass, size, zeroed);
if(v == nil)
runtime·throw("out of memory");
l = &c->list[sizeclass];
if(l->list == nil)
runtime·MCache_Refill(c, sizeclass);
v = l->list;
l->list = v->next;
l->nlist--;
if(zeroed) {
v->next = nil;
// block is zeroed iff second word is zero ...
if(size > sizeof(uintptr) && ((uintptr*)v)[1] != 0)
runtime·memclr((byte*)v, size);
}
c->local_cachealloc += size;
c->local_objects++;
c->local_alloc += size;
c->local_total_alloc += size;
c->local_by_size[sizeclass].nmalloc++;

View file

@ -305,7 +305,7 @@ struct MCache
};
void* runtime·MCache_Alloc(MCache *c, int32 sizeclass, uintptr size, int32 zeroed);
void runtime·MCache_Refill(MCache *c, int32 sizeclass);
void runtime·MCache_Free(MCache *c, void *p, int32 sizeclass, uintptr size);
void runtime·MCache_ReleaseAll(MCache *c);

View file

@ -10,35 +10,18 @@
#include "arch_GOARCH.h"
#include "malloc.h"
void*
runtime·MCache_Alloc(MCache *c, int32 sizeclass, uintptr size, int32 zeroed)
void
runtime·MCache_Refill(MCache *c, int32 sizeclass)
{
MCacheList *l;
MLink *v;
// Allocate from list.
// Replenish using central lists.
l = &c->list[sizeclass];
if(l->list == nil) {
// Replenish using central lists.
l->nlist = runtime·MCentral_AllocList(&runtime·mheap->central[sizeclass], &l->list);
if(l->list == nil)
runtime·throw("out of memory");
}
v = l->list;
l->list = v->next;
l->nlist--;
// v is zeroed except for the link pointer
// that we used above; zero that.
v->next = nil;
if(zeroed) {
// block is zeroed iff second word is zero ...
if(size > sizeof(uintptr) && ((uintptr*)v)[1] != 0)
runtime·memclr((byte*)v, size);
}
c->local_cachealloc += size;
c->local_objects++;
return v;
if(l->list)
runtime·throw("MCache_Refill: the list is not empty");
l->nlist = runtime·MCentral_AllocList(&runtime·mheap->central[sizeclass], &l->list);
if(l->list == nil)
runtime·throw("out of memory");
}
// Take n elements off l and return them to the central free list.