You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
cmd/compile: decrease inlining call cost from 60 to 57
A Go user made a well-documented request for a slightly
lower threshold. I tested against a selection of other
people's benchmarks, and saw a tiny benefit (possibly noise)
at equally tiny cost, and no unpleasant surprises observed
in benchmarking.
I.e., might help, doesn't hurt, low risk, request was
delivered on a silver platter.
It did, however, change the behavior of one test because
now bytes.Buffer.Grow is eligible for inlining.
Updates #19348.
Change-Id: I85e3088a4911290872b8c6bda9601b5354c48695
Reviewed-on: https://go-review.googlesource.com/c/151977
Run-TryBot: David Chase <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Keith Randall <[email protected]>
Copy file name to clipboardExpand all lines: src/cmd/compile/internal/gc/inl.go
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -39,7 +39,7 @@ const (
39
39
inlineMaxBudget=80
40
40
inlineExtraAppendCost=0
41
41
// default is to inline if there's at most one call. -l=4 overrides this by using 1 instead.
42
-
inlineExtraCallCost=inlineMaxBudget*3/4
42
+
inlineExtraCallCost=57// 57 was benchmarked to provided most benefit with no bad surprises; see https://github.com/golang/go/issues/19348#issuecomment-439370742
43
43
inlineExtraPanicCost=1// do not penalize inlining panics.
44
44
inlineExtraThrowCost=inlineMaxBudget// with current (2018-05/1.11) code, inlining runtime.throw does not help.
// copied during String() call, but object "handle" itself
18
18
// can be stack-allocated.
19
19
varb bytes.Buffer
20
-
b.WriteString("123") // ERROR "b does not escape"
21
-
b.Write([]byte{'4'}) // ERROR "b does not escape" "\[\]byte literal does not escape"
22
-
returnb.String() // ERROR "b does not escape" "inlining call" "string\(bytes\.b\.buf\[bytes.b.off:\]\) escapes to heap"
20
+
b.WriteString("123") // ERROR "bufferNotEscape b does not escape$"
21
+
b.Write([]byte{'4'}) // ERROR "bufferNotEscape \[\]byte literal does not escape$" "bufferNotEscape b does not escape$"
22
+
returnb.String() // ERROR "bufferNotEscape b does not escape$" "inlining call to bytes.\(\*Buffer\).String$" "string\(bytes.b.buf\[bytes.b.off:\]\) escapes to heap$"
23
23
}
24
24
25
-
funcbufferNoEscape2(xs []string) int { // ERROR "xs does not escape"
26
-
b:=bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "inlining call" "make\(\[\]byte, 0, 64\) does not escape" "&bytes.Buffer literal does not escape"
25
+
funcbufferNoEscape2(xs []string) int { // ERROR "bufferNoEscape2 xs does not escape$"
26
+
b:=bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "bufferNoEscape2 &bytes.Buffer literal does not escape$" "bufferNoEscape2 make\(\[\]byte, 0, 64\) does not escape$" "inlining call to bytes.NewBuffer$"
27
27
for_, x:=rangexs {
28
28
b.WriteString(x)
29
29
}
30
-
returnb.Len() // ERROR "inlining call"
30
+
returnb.Len() // ERROR "inlining call to bytes.\(\*Buffer\).Len$"
31
31
}
32
32
33
-
funcbufferNoEscape3(xs []string) string { // ERROR "xs does not escape"
34
-
b:=bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "inlining call" "make\(\[\]byte, 0, 64\) does not escape" "&bytes.Buffer literal does not escape"
33
+
funcbufferNoEscape3(xs []string) string { // ERROR "bufferNoEscape3 xs does not escape$"
34
+
b:=bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "bufferNoEscape3 &bytes.Buffer literal does not escape$" "bufferNoEscape3 make\(\[\]byte, 0, 64\) does not escape$" "inlining call to bytes.NewBuffer$"
35
35
for_, x:=rangexs {
36
36
b.WriteString(x)
37
37
b.WriteByte(',')
38
38
}
39
-
returnb.String() // ERROR "inlining call" "string\(bytes.b.buf\[bytes\.b\.off:\]\) escapes to heap"
39
+
returnb.String() // ERROR "inlining call to bytes.\(\*Buffer\).String$" "string\(bytes.b.buf\[bytes.b.off:\]\) escapes to heap$"
40
40
}
41
41
42
42
funcbufferNoEscape4() []byte {
43
43
varb bytes.Buffer
44
-
b.Grow(64) // ERROR "b does not escape"
45
-
useBuffer(&b) // ERROR "&b does not escape"
46
-
returnb.Bytes() // ERROR "inlining call" "b does not escape"
44
+
b.Grow(64) // ERROR "bufferNoEscape4 b does not escape$" "bufferNoEscape4 ignoring self-assignment in bytes.b.buf = bytes.b.buf\[:bytes.m·3\]$" "inlining call to bytes.\(\*Buffer\).Grow$"
45
+
useBuffer(&b) // ERROR "bufferNoEscape4 &b does not escape$"
46
+
returnb.Bytes() // ERROR "bufferNoEscape4 b does not escape$" "inlining call to bytes.\(\*Buffer\).Bytes$"
b:=bytes.NewBuffer(make([]byte, 0, 128)) // ERROR "bufferNoEscape5 &bytes.Buffer literal does not escape$" "bufferNoEscape5 make\(\[\]byte, 0, 128\) does not escape$" "inlining call to bytes.NewBuffer$"
51
51
useBuffer(b)
52
52
}
53
53
54
54
//go:noinline
55
-
funcuseBuffer(b*bytes.Buffer) { // ERROR "b does not escape"
55
+
funcuseBuffer(b*bytes.Buffer) { // ERROR "useBuffer b does not escape$"
0 commit comments