1
0
mirror of https://github.com/golang/go synced 2024-11-26 14:46:47 -07:00

cmd/gc, runtime: pass PC directly to racefuncenter.

go test -race -run none -bench . encoding/json
benchmark                      old ns/op    new ns/op    delta
BenchmarkCodeEncoder          3207689000   1716149000  -46.50%
BenchmarkCodeMarshal          3206761000   1715677000  -46.50%
BenchmarkCodeDecoder          8647304000   4482709000  -48.16%
BenchmarkCodeUnmarshal        8032217000   3451248000  -57.03%
BenchmarkCodeUnmarshalReuse   8016722000   3480502000  -56.58%
BenchmarkSkipValue           10340453000   4560313000  -55.90%

benchmark                       old MB/s     new MB/s  speedup
BenchmarkCodeEncoder                0.60         1.13    1.88x
BenchmarkCodeMarshal                0.61         1.13    1.85x
BenchmarkCodeDecoder                0.22         0.43    1.95x
BenchmarkCodeUnmarshal              0.24         0.56    2.33x
BenchmarkCodeUnmarshalReuse         0.24         0.56    2.33x
BenchmarkSkipValue                  0.19         0.44    2.32x

Fixes #4248.

R=dvyukov, golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6815066
This commit is contained in:
Rémy Oudompheng 2012-11-01 19:43:29 +01:00
parent 5d15963a1f
commit ce287933d6
4 changed files with 16 additions and 9 deletions

View File

@ -102,7 +102,7 @@ char *runtimeimport =
"func @\"\".int64tofloat64(? int64) (? float64)\n"
"func @\"\".uint64tofloat64(? uint64) (? float64)\n"
"func @\"\".complex128div(@\"\".num complex128, @\"\".den complex128) (@\"\".quo complex128)\n"
"func @\"\".racefuncenter()\n"
"func @\"\".racefuncenter(? uintptr)\n"
"func @\"\".racefuncexit()\n"
"func @\"\".raceread(? uintptr)\n"
"func @\"\".racewrite(? uintptr)\n"

View File

@ -33,6 +33,7 @@ racewalk(Node *fn)
{
int i;
Node *nd;
Node *nodpc;
char s[1024];
if(myimportpath) {
@ -42,10 +43,14 @@ racewalk(Node *fn)
}
}
// TODO(dvyukov): ideally this should be:
// racefuncenter(getreturnaddress())
// because it's much more costly to obtain from runtime library.
nd = mkcall("racefuncenter", T, nil);
// nodpc is the PC of the caller as extracted by
// getcallerpc. We use -widthptr(FP) for x86.
// BUG: this will not work on arm.
nodpc = nod(OXXX, nil, nil);
*nodpc = *nodfp;
nodpc->type = types[TUINTPTR];
nodpc->xoffset = -widthptr;
nd = mkcall("racefuncenter", T, nil, nodpc);
fn->enter = list(fn->enter, nd);
nd = mkcall("racefuncexit", T, nil);
fn->exit = list(fn->exit, nd); // works fine if (!fn->exit)

View File

@ -140,7 +140,7 @@ func uint64tofloat64(uint64) float64
func complex128div(num complex128, den complex128) (quo complex128)
// race detection
func racefuncenter()
func racefuncenter(uintptr)
func racefuncexit()
func raceread(uintptr)
func racewrite(uintptr)

View File

@ -70,11 +70,13 @@ runtime·raceread(uintptr addr)
// Called from instrumented code.
void
runtime·racefuncenter(void)
runtime·racefuncenter(uintptr pc)
{
uintptr pc;
// If the caller PC is lessstack, use slower runtime·callers
// to walk across the stack split to find the real caller.
if(pc == (uintptr)runtime·lessstack)
runtime·callers(2, &pc, 1);
runtime·callers(2, &pc, 1);
m->racecall = true;
runtimerace·FuncEnter(g->goid-1, (void*)pc);
m->racecall = false;