go/test
Dmitry Vyukov e6fac08146 cmd/gc: allocate buffers for non-escaped strings on stack
Currently we always allocate string buffers in heap.
For example, in the following code we allocate a temp string
just for comparison:

	if string(byteSlice) == "abc" { ... }

This change extends escape analysis to cover []byte->string
conversions and string concatenation. If the result of operations
does not escape, compiler allocates a small buffer
on stack and passes it to slicebytetostring and concatstrings.
Then runtime uses the buffer if the result fits into it.

Size of the buffer is 32 bytes. There is no fundamental theory
behind this number. Just an observation that on std lib
tests/benchmarks frequency of string allocation is inversely
proportional to string length; and there is significant number
of allocations up to length 32.

benchmark                                    old allocs     new allocs     delta
BenchmarkFprintfBytes                        2              1              -50.00%
BenchmarkDecodeComplex128Slice               318            316            -0.63%
BenchmarkDecodeFloat64Slice                  318            316            -0.63%
BenchmarkDecodeInt32Slice                    318            316            -0.63%
BenchmarkDecodeStringSlice                   2318           2316           -0.09%
BenchmarkStripTags                           11             5              -54.55%
BenchmarkDecodeGray                          111            102            -8.11%
BenchmarkDecodeNRGBAGradient                 200            188            -6.00%
BenchmarkDecodeNRGBAOpaque                   165            152            -7.88%
BenchmarkDecodePaletted                      319            309            -3.13%
BenchmarkDecodeRGB                           166            157            -5.42%
BenchmarkDecodeInterlacing                   279            268            -3.94%
BenchmarkGoLookupIP                          153            135            -11.76%
BenchmarkGoLookupIPNoSuchHost                508            466            -8.27%
BenchmarkGoLookupIPWithBrokenNameServer      245            226            -7.76%
BenchmarkClientServerParallel4               62             61             -1.61%
BenchmarkClientServerParallel64              62             61             -1.61%
BenchmarkClientServerParallelTLS4            79             78             -1.27%
BenchmarkClientServerParallelTLS64           112            111            -0.89%

benchmark                                    old ns/op      new ns/op      delta
BenchmarkFprintfBytes                        381            311            -18.37%
BenchmarkStripTags                           2615           2351           -10.10%
BenchmarkDecodeNRGBAGradient                 3715887        3635096        -2.17%
BenchmarkDecodeNRGBAOpaque                   3047645        2928644        -3.90%
BenchmarkGoLookupIP                          153            135            -11.76%
BenchmarkGoLookupIPNoSuchHost                508            466            -8.27%

Change-Id: I9ec01da816945c3329d7be3c7794b520418c3f99
Reviewed-on: https://go-review.googlesource.com/3120
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
2015-01-28 20:12:38 +00:00
..
bench build: adjustments for move from src/pkg to src 2014-09-08 00:06:45 -04:00
bugs test: migrate remaining tests to run.go 2014-12-22 22:41:34 +00:00
chan cmd/gc: implement 'for range x {' 2014-07-16 19:27:10 -04:00
ddd2.dir
dwarf
fixedbugs cmd/gc: allow map index expressions in for range statements 2015-01-28 15:14:04 +00:00
import2.dir
import4.dir test: match gccgo import error messages 2013-12-12 19:02:11 -08:00
interface cmd/gc: blank methods are not permitted in interface types 2014-10-15 09:55:13 -07:00
ken
method4.dir cmd/gc: do not omit wrapper for expression (interface{...}).F 2014-01-07 13:26:48 +01:00
safe
stress build: adjustments for move from src/pkg to src 2014-09-08 00:06:45 -04:00
syntax test: match gccgo error messages 2013-12-12 17:18:12 -08:00
64bit.go
235.go
alias.go
alias1.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
append.go
args.go
assign.go cmd/gc: prohibit short variable declarations containing duplicate symbols 2014-10-06 17:16:39 -04:00
assign1.go
bigalg.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
bigmap.go
blank.go test: revert changes made for Go SSA interpreter test. 2013-10-08 14:36:20 -04:00
blank1.go test: match gccgo error messages for blank1.go 2013-09-28 15:19:05 -07:00
bom.go
bombad.go
bounds.go
chancap.go
chanlinear.go runtime: test for linear enqueue/dequeue behavior 2014-12-08 22:18:17 +00:00
char_lit.go
char_lit1.go
clearfat.go [dev.power64] 9g: fix under-zeroing in clearfat 2014-10-31 11:08:27 -04:00
closedchan.go
closure.go
cmp.go cmd/gc: do not nop-convert equivalent but different interface types. 2014-02-27 08:07:50 +01:00
cmp6.go cmd/gc: do not consider length zero arrays as comparable. 2014-01-31 00:30:56 +01:00
cmplx.go cmd/gc: reject complex calls with mismatched argument types. 2013-03-11 22:55:14 +01:00
cmplxdivide.c test: comment the behavior and use of cmplxdivide* 2015-01-15 00:00:06 +00:00
cmplxdivide.go test: comment the behavior and use of cmplxdivide* 2015-01-15 00:00:06 +00:00
cmplxdivide1.go
complit.go
complit1.go
compos.go
const.go exp/ssa/interp: (#6 of 5): test interpretation of SSA form of $GOROOT/test/*.go. 2013-02-21 12:48:38 -05:00
const1.go test: match gccgo error messages 2013-12-12 17:18:12 -08:00
const2.go
const3.go
const4.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
const5.go cmd/gc: reject builtin function calls in len(fixed array) constants 2014-04-03 19:04:33 -04:00
const6.go test: match gccgo error strings. 2013-06-26 18:05:02 +02:00
convT2X.go
convert.go
convert1.go
convert3.go
convlit.go
convlit1.go
copy.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
crlf.go
ddd.go
ddd1.go
ddd2.go
decl.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
declbad.go
defer.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
deferfin.go runtime: combine small NoScan allocations 2014-01-24 22:35:11 +04:00
deferprint.go
deferprint.out
divide.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
divmod.go all: fix a few spelling errors in source comments 2013-12-27 08:59:02 -08:00
empty.go
env.go
eof.go
eof1.go
errchk test/errchk: use "#!/usr/bin/env perl" shebang line 2013-05-23 04:41:22 +08:00
escape.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
escape2.go cmd/gc: allocate buffers for non-escaped strings on stack 2015-01-28 20:12:38 +00:00
escape2n.go cmd/gc: allocate buffers for non-escaped strings on stack 2015-01-28 20:12:38 +00:00
escape3.go
escape4.go
escape5.go cmd/gc: distinguish unnamed vs blank-named return variables better 2014-02-13 20:59:39 -05:00
fibo.go Fix whitespace (use blanks consistently). 2014-12-08 22:22:58 +00:00
float_lit.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
float_lit2.go test: fix two typos in float_lit2.go 2014-05-21 17:19:12 -04:00
float_lit3.go test/float_lit2.go: rewrite to test values near boundaries 2014-05-21 17:12:06 -04:00
floatcmp.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
for.go
func.go
func1.go cmd/gc: ensure unique parameter and result names in function types 2013-03-15 15:24:13 -04:00
func2.go
func3.go
func4.go
func5.go
func6.go
func7.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
func8.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
funcdup.go test: match gccgo error messages 2013-12-12 17:18:12 -08:00
funcdup2.go test: match gccgo error messages 2013-12-12 17:18:12 -08:00
gc.go
gc1.go
gc2.go build: make nacl pass 2014-05-20 12:10:19 -04:00
gcstring.go runtime: fix empty string handling in garbage collector 2014-03-11 23:58:39 -04:00
goprint.go test: make goprint.go wait longer for go its routine to execute 2013-04-12 16:04:19 -07:00
goprint.out
goto.go
helloworld.go
helloworld.out
if.go
import.go
import1.go test: match gccgo import error messages 2013-12-12 19:02:11 -08:00
import2.go
import4.go
import5.go
index.go test: recognize gccgo error message in index.go 2013-09-27 20:38:52 -07:00
index0.go
index1.go
index2.go
indirect.go
indirect1.go
init.go
init1.go runtime: increase GC concurrency. 2015-01-08 20:34:56 +00:00
initcomma.go
initialize.go
initializerr.go
int_lit.go
intcvt.go
iota.go
label.go
label1.go
linkx.go test: move linkx and sinit to run.go 2014-11-06 15:14:08 -05:00
linkx_run.go cmd/go: put user ldflags at the end of the linker invocation 2015-01-02 18:36:44 +00:00
literal.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
live.go [dev.garbage] all: merge dev.power64 (7667e41f3ced) into dev.garbage 2014-11-14 12:09:42 -05:00
live1.go cmd/gc: correct liveness for fat variables 2014-02-15 10:58:55 -05:00
live2.go [dev.garbage] cmd/gc, runtime: add locks around print statements 2014-11-05 14:42:54 -05:00
mallocfin.go
map.go test/mapnan.go: add regression test for non-empty interfaces. 2014-08-06 17:02:55 -04:00
map1.go
maplinear.go test: make maplinear more robust 2014-10-27 18:59:02 -04:00
method.go test: a number of fixes. 2013-02-11 18:20:52 -05:00
method1.go
method2.go cmd/gc: fix method values whose receiver is an unnamed interface. 2013-08-29 10:00:58 +02:00
method3.go
method4.go
method5.go cmd/gc: implement method values 2013-03-20 17:11:09 -04:00
named.go
named1.go cmd/gc: comma-ok assignments produce untyped bool as 2nd result 2014-08-11 16:11:55 -07:00
nil.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
nilcheck.go cmd/gc: optimize existence-only map lookups 2015-01-07 22:36:06 +00:00
nilptr.go test/nilptr: add more tests 2013-09-05 23:06:34 -04:00
nilptr2.go test: revert changes made for Go SSA interpreter test. 2013-10-08 14:36:20 -04:00
nilptr3.go all: power64 is now ppc64 2014-12-05 19:13:20 -05:00
nilptr4.go cmd/gc: fix bad checknil with ints on 32 bit compilers 2014-02-26 12:25:13 -08:00
nosplit.go all: merge dev.garbage (d1238958d4ae) into default branch 2014-12-05 20:34:45 -05:00
nul1.go
parentype.go
peano.go
print.go runtime: move built-in print routines to go. 2014-07-31 13:48:48 -07:00
print.out runtime: move built-in print routines to go. 2014-07-31 13:48:48 -07:00
printbig.go
printbig.out
range.go cmd/gc: implement 'for range x {' 2014-07-16 19:27:10 -04:00
recover.go test: add more cases to recover.go 2014-10-22 08:06:15 -07:00
recover1.go
recover2.go
recover3.go tests: remove two misuses of nil pointers 2013-08-15 11:51:04 -04:00
rename.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00
rename1.go
reorder.go test: a number of fixes. 2013-02-11 18:20:52 -05:00
reorder2.go cmd/gc: shorten temporary lifetimes when possible 2014-04-01 13:31:38 -04:00
return.go test: add cases to return.go that gccgo got wrong 2013-08-07 11:31:01 -07:00
rotate.go
rotate0.go
rotate1.go
rotate2.go
rotate3.go
run.go test: migrate remaining tests to run.go 2014-12-22 22:41:34 +00:00
rune.go
runtime.go
shift1.go test: avoid "declared but not used" errors in shift1.go 2014-07-20 12:25:24 -07:00
shift2.go test: add shift expression incorrectly rejected by gccgo. 2013-06-25 08:06:34 +02:00
sieve.go
sigchld.go test: skip SIGCHLD test on Plan 9 2014-01-29 09:28:23 +01:00
sigchld.out
simassign.go
sinit.go test: move linkx and sinit to run.go 2014-11-06 15:14:08 -05:00
sinit_run.go test: fix nacl build 2014-11-09 21:10:49 -05:00
sizeof.go test: correct sizeof.go. 2013-06-02 19:10:11 +02:00
slice3.go cmd/gc, runtime: treat slices and strings like pointers in garbage collection 2014-08-25 14:38:19 -04:00
slice3err.go test: match gccgo error messages 2013-12-12 17:18:12 -08:00
slicecap.go cmd/gc, runtime: treat slices and strings like pointers in garbage collection 2014-08-25 14:38:19 -04:00
solitaire.go
stack.go
string_lit.go test: add []rune case to string_lit.go 2013-12-12 17:17:02 -08:00
stringrange.go
struct0.go
switch.go cmd/gc: disallow fallthrough in final case of switch 2013-03-15 00:35:09 -04:00
switch3.go
switch4.go cmd/gc: disallow fallthrough in final case of switch 2013-03-15 00:35:09 -04:00
tinyfin.go runtime: combine small NoScan allocations 2014-01-24 22:35:11 +04:00
torture.go cmd/8g: don't allocate a register early for cap(CHAN). 2014-07-01 09:20:51 +02:00
turing.go
typecheck.go cmd/gc: silence assignment errors to undefined symbols 2014-01-03 21:03:20 +01:00
typeswitch.go
typeswitch1.go
typeswitch2.go
typeswitch3.go
undef.go
utf.go
varerr.go
varinit.go
zerodivide.go test: ensure all failing tests exit nonzero. 2013-02-12 13:17:49 -05:00