Commit 0cd3ecb0 authored by Robert Griesemer's avatar Robert Griesemer

cmd/compile: reduce allocs some more

Also: update fmt_test.go.

Together with the previous commits, we are now at or below c85b77c2
levels in terms of allocation for the benchmark described in #16897
(old = c85b77c2, new = this commit):

name       old time/op     new time/op     delta
Template       297ms ± 5%      284ms ± 3%  -4.53%  (p=0.000 n=27+29)
Unicode        159ms ± 5%      151ms ± 5%  -4.91%  (p=0.000 n=28+30)
GoTypes        985ms ± 5%      935ms ± 2%  -5.13%  (p=0.000 n=28+29)

name       old alloc/op    new alloc/op    delta
Template      46.8MB ± 0%     45.7MB ± 0%  -2.37%  (p=0.000 n=30+30)
Unicode       37.8MB ± 0%     37.9MB ± 0%  +0.29%  (p=0.000 n=29+30)
GoTypes        143MB ± 0%      138MB ± 0%  -3.64%  (p=0.000 n=29+30)

name       old allocs/op   new allocs/op   delta
Template        444k ± 0%       440k ± 0%  -0.94%  (p=0.000 n=30+30)
Unicode         369k ± 0%       369k ± 0%  +0.19%  (p=0.000 n=29+30)
GoTypes        1.35M ± 0%      1.34M ± 0%  -1.24%  (p=0.000 n=30+30)

For #16897.

Change-Id: Iedbeb408e2f1e68dd4a3201bf8813c8066ebf7ed
Reviewed-on: https://go-review.googlesource.com/29089Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
parent b6946fb1
...@@ -552,19 +552,15 @@ var knownFormats = map[string]string{ ...@@ -552,19 +552,15 @@ var knownFormats = map[string]string{
"*cmd/compile/internal/gc.Node %j": "", "*cmd/compile/internal/gc.Node %j": "",
"*cmd/compile/internal/gc.Node %p": "", "*cmd/compile/internal/gc.Node %p": "",
"*cmd/compile/internal/gc.Node %v": "", "*cmd/compile/internal/gc.Node %v": "",
"*cmd/compile/internal/gc.Sym % v": "",
"*cmd/compile/internal/gc.Sym %+v": "", "*cmd/compile/internal/gc.Sym %+v": "",
"*cmd/compile/internal/gc.Sym %-v": "", "*cmd/compile/internal/gc.Sym %-v": "",
"*cmd/compile/internal/gc.Sym %0S": "", "*cmd/compile/internal/gc.Sym %0S": "",
"*cmd/compile/internal/gc.Sym %S": "", "*cmd/compile/internal/gc.Sym %S": "",
"*cmd/compile/internal/gc.Sym %p": "", "*cmd/compile/internal/gc.Sym %p": "",
"*cmd/compile/internal/gc.Sym %v": "", "*cmd/compile/internal/gc.Sym %v": "",
"*cmd/compile/internal/gc.Type % -v": "",
"*cmd/compile/internal/gc.Type %#v": "", "*cmd/compile/internal/gc.Type %#v": "",
"*cmd/compile/internal/gc.Type %+v": "", "*cmd/compile/internal/gc.Type %+v": "",
"*cmd/compile/internal/gc.Type %- v": "",
"*cmd/compile/internal/gc.Type %-S": "", "*cmd/compile/internal/gc.Type %-S": "",
"*cmd/compile/internal/gc.Type %-v": "",
"*cmd/compile/internal/gc.Type %0S": "", "*cmd/compile/internal/gc.Type %0S": "",
"*cmd/compile/internal/gc.Type %L": "", "*cmd/compile/internal/gc.Type %L": "",
"*cmd/compile/internal/gc.Type %S": "", "*cmd/compile/internal/gc.Type %S": "",
......
...@@ -17,6 +17,9 @@ import ( ...@@ -17,6 +17,9 @@ import (
// See the respective function's documentation for details. // See the respective function's documentation for details.
type FmtFlag int type FmtFlag int
// TODO(gri) The ' ' flag is not used anymore in %-formats.
// Eliminate eventually.
const ( // fmt.Format flag/prec or verb const ( // fmt.Format flag/prec or verb
FmtLeft FmtFlag = 1 << iota // '-' FmtLeft FmtFlag = 1 << iota // '-'
FmtSharp // '#' FmtSharp // '#'
...@@ -1556,6 +1559,7 @@ func (n *Node) nodedump(s fmt.State, flag FmtFlag) { ...@@ -1556,6 +1559,7 @@ func (n *Node) nodedump(s fmt.State, flag FmtFlag) {
} }
} }
// "%S" suppresses qualifying with package
func (s *Sym) Format(f fmt.State, verb rune) { func (s *Sym) Format(f fmt.State, verb rune) {
switch verb { switch verb {
case 'v', 'S': case 'v', 'S':
...@@ -1570,7 +1574,7 @@ func (s *Sym) String() string { ...@@ -1570,7 +1574,7 @@ func (s *Sym) String() string {
return s.sconv(0) return s.sconv(0)
} }
// "%S" suppresses qualifying with package // See #16897 before changing the implementation of sconv.
func (s *Sym) sconv(flag FmtFlag) string { func (s *Sym) sconv(flag FmtFlag) string {
if flag&FmtLong != 0 { if flag&FmtLong != 0 {
panic("linksymfmt") panic("linksymfmt")
...@@ -1671,6 +1675,9 @@ func Fldconv(f *Field, flag FmtFlag) string { ...@@ -1671,6 +1675,9 @@ func Fldconv(f *Field, flag FmtFlag) string {
return str return str
} }
// "%L" print definition, not name
// "%S" omit 'func' and receiver from function types, short type names
// "% v" package name, not prefix (FTypeId mode, sticky)
func (t *Type) Format(s fmt.State, verb rune) { func (t *Type) Format(s fmt.State, verb rune) {
switch verb { switch verb {
case 'v', 'S', 'L': case 'v', 'S', 'L':
...@@ -1681,9 +1688,7 @@ func (t *Type) Format(s fmt.State, verb rune) { ...@@ -1681,9 +1688,7 @@ func (t *Type) Format(s fmt.State, verb rune) {
} }
} }
// "%L" print definition, not name // See #16897 before changing the implementation of tconv.
// "%S" omit 'func' and receiver from function types, short type names
// "% v" package name, not prefix (FTypeId mode, sticky)
func (t *Type) tconv(flag FmtFlag) string { func (t *Type) tconv(flag FmtFlag) string {
if t == nil { if t == nil {
return "<T>" return "<T>"
......
...@@ -1147,10 +1147,11 @@ func syslook(name string) *Node { ...@@ -1147,10 +1147,11 @@ func syslook(name string) *Node {
// typehash computes a hash value for type t to use in type switch // typehash computes a hash value for type t to use in type switch
// statements. // statements.
func typehash(t *Type) uint32 { func typehash(t *Type) uint32 {
// fmt.Sprintf("%- v", t) already contains all the necessary logic to generate // t.tconv(FmtLeft | FmtUnsigned) already contains all the necessary logic
// a representation that completely describes the type, so using // to generate a representation that completely describes the type, so using
// it here avoids duplicating that code. // it here avoids duplicating that code.
p := fmt.Sprintf("%- v", t) // See the comments in exprSwitch.checkDupCases.
p := t.tconv(FmtLeft | FmtUnsigned)
// Using MD5 is overkill, but reduces accidental collisions. // Using MD5 is overkill, but reduces accidental collisions.
h := md5.Sum([]byte(p)) h := md5.Sum([]byte(p))
......
...@@ -4,10 +4,7 @@ ...@@ -4,10 +4,7 @@
package gc package gc
import ( import "sort"
"fmt"
"sort"
)
const ( const (
// expression switch // expression switch
...@@ -647,9 +644,9 @@ func (s *exprSwitch) checkDupCases(cc []caseClause) { ...@@ -647,9 +644,9 @@ func (s *exprSwitch) checkDupCases(cc []caseClause) {
} }
n := c.node.Left n := c.node.Left
tv := typeVal{ tv := typeVal{
// fmt.Sprintf("% -v", n.Type) here serves to completely describe the type. // n.Type.tconv(FmtLeft | FmtUnsigned) here serves to completely describe the type.
// See the comments in func typehash. // See the comments in func typehash.
typ: fmt.Sprintf("% -v", n.Type), typ: n.Type.tconv(FmtLeft | FmtUnsigned),
val: n.Val().Interface(), val: n.Val().Interface(),
} }
prev, dup := seen[tv] prev, dup := seen[tv]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment