Skip to content

Commit 211ee9f

Browse files
committed
cmd/compile: use a bytes.Buffer to format symbols
No significant compiler speed changes, but some minor memory savings. Passes toolstash-check. name old alloc/op new alloc/op delta Template 36.3MB ± 0% 36.2MB ± 0% -0.25% (p=0.008 n=5+5) Unicode 28.3MB ± 0% 28.2MB ± 0% -0.16% (p=0.008 n=5+5) GoTypes 122MB ± 0% 121MB ± 0% -0.39% (p=0.008 n=5+5) Compiler 568MB ± 0% 566MB ± 0% -0.21% (p=0.008 n=5+5) SSA 1.95GB ± 0% 1.95GB ± 0% -0.08% (p=0.008 n=5+5) Flate 22.8MB ± 0% 22.8MB ± 0% -0.21% (p=0.008 n=5+5) GoParser 28.0MB ± 0% 27.9MB ± 0% -0.38% (p=0.008 n=5+5) Reflect 78.6MB ± 0% 78.3MB ± 0% -0.33% (p=0.008 n=5+5) Tar 34.1MB ± 0% 34.1MB ± 0% -0.19% (p=0.008 n=5+5) XML 44.3MB ± 0% 44.2MB ± 0% -0.19% (p=0.008 n=5+5) [Geo mean] 79.9MB 79.7MB -0.24% name old allocs/op new allocs/op delta Template 363k ± 0% 359k ± 0% -1.21% (p=0.008 n=5+5) Unicode 329k ± 0% 326k ± 0% -0.90% (p=0.008 n=5+5) GoTypes 1.28M ± 0% 1.25M ± 0% -2.62% (p=0.008 n=5+5) Compiler 5.39M ± 0% 5.31M ± 0% -1.45% (p=0.008 n=5+5) SSA 18.1M ± 0% 17.9M ± 0% -0.78% (p=0.008 n=5+5) Flate 228k ± 0% 226k ± 0% -0.97% (p=0.008 n=5+5) GoParser 295k ± 0% 288k ± 0% -2.26% (p=0.008 n=5+5) Reflect 949k ± 0% 932k ± 0% -1.74% (p=0.008 n=5+5) Tar 336k ± 0% 332k ± 0% -1.12% (p=0.008 n=5+5) XML 417k ± 0% 413k ± 0% -1.10% (p=0.008 n=5+5) [Geo mean] 818k 806k -1.42% Change-Id: Ibdb94650a761edec17d8eba0abdfb70a8a495da9 Reviewed-on: https://go-review.googlesource.com/c/go/+/222920 Run-TryBot: Josh Bleecher Snyder <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Robert Griesemer <[email protected]>
1 parent b136f0c commit 211ee9f

1 file changed

Lines changed: 62 additions & 22 deletions

File tree

  • src/cmd/compile/internal/gc

src/cmd/compile/internal/gc/fmt.go

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -585,28 +585,44 @@ s%^ ........*\]%&~%g
585585
s%~ %%g
586586
*/
587587

588-
func symfmt(s *types.Sym, flag FmtFlag, mode fmtMode) string {
588+
func symfmt(b *bytes.Buffer, s *types.Sym, flag FmtFlag, mode fmtMode) {
589589
if s.Pkg != nil && flag&FmtShort == 0 {
590590
switch mode {
591591
case FErr: // This is for the user
592592
if s.Pkg == builtinpkg || s.Pkg == localpkg {
593-
return s.Name
593+
b.WriteString(s.Name)
594+
return
594595
}
595596

596597
// If the name was used by multiple packages, display the full path,
597598
if s.Pkg.Name != "" && numImport[s.Pkg.Name] > 1 {
598-
return fmt.Sprintf("%q.%s", s.Pkg.Path, s.Name)
599+
fmt.Fprintf(b, "%q.%s", s.Pkg.Path, s.Name)
600+
return
599601
}
600-
return s.Pkg.Name + "." + s.Name
602+
b.WriteString(s.Pkg.Name)
603+
b.WriteByte('.')
604+
b.WriteString(s.Name)
605+
return
601606

602607
case FDbg:
603-
return s.Pkg.Name + "." + s.Name
608+
b.WriteString(s.Pkg.Name)
609+
b.WriteByte('.')
610+
b.WriteString(s.Name)
611+
return
604612

605613
case FTypeIdName:
606-
return s.Pkg.Name + "." + s.Name // dcommontype, typehash
614+
// dcommontype, typehash
615+
b.WriteString(s.Pkg.Name)
616+
b.WriteByte('.')
617+
b.WriteString(s.Name)
618+
return
607619

608620
case FTypeId:
609-
return s.Pkg.Prefix + "." + s.Name // (methodsym), typesym, weaksym
621+
// (methodsym), typesym, weaksym
622+
b.WriteString(s.Pkg.Prefix)
623+
b.WriteByte('.')
624+
b.WriteString(s.Name)
625+
return
610626
}
611627
}
612628

@@ -619,13 +635,15 @@ func symfmt(s *types.Sym, flag FmtFlag, mode fmtMode) string {
619635
}
620636

621637
if mode == FDbg {
622-
return fmt.Sprintf("@%q.%s", s.Pkg.Path, name)
638+
fmt.Fprintf(b, "@%q.%s", s.Pkg.Path, name)
639+
return
623640
}
624641

625-
return name
642+
b.WriteString(name)
643+
return
626644
}
627645

628-
return s.Name
646+
b.WriteString(s.Name)
629647
}
630648

631649
var basicnames = []string{
@@ -652,16 +670,16 @@ var basicnames = []string{
652670
TBLANK: "blank",
653671
}
654672

655-
var tconvBufferPool = sync.Pool{
673+
var fmtBufferPool = sync.Pool{
656674
New: func() interface{} {
657675
return new(bytes.Buffer)
658676
},
659677
}
660678

661679
func tconv(t *types.Type, flag FmtFlag, mode fmtMode) string {
662-
buf := tconvBufferPool.Get().(*bytes.Buffer)
680+
buf := fmtBufferPool.Get().(*bytes.Buffer)
663681
buf.Reset()
664-
defer tconvBufferPool.Put(buf)
682+
defer fmtBufferPool.Put(buf)
665683

666684
tconv2(buf, t, flag, mode, nil)
667685
return types.InternString(buf.Bytes())
@@ -703,7 +721,7 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode fmtMode, visited
703721
case FTypeIdName, FTypeId:
704722
t = types.Types[t.Etype]
705723
default:
706-
b.WriteString(sconv(t.Sym, FmtShort, mode))
724+
sconv2(b, t.Sym, FmtShort, mode)
707725
return
708726
}
709727
}
@@ -718,15 +736,16 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode fmtMode, visited
718736
case FTypeId, FTypeIdName:
719737
if flag&FmtShort != 0 {
720738
if t.Vargen != 0 {
721-
fmt.Fprintf(b, "%s·%d", sconv(t.Sym, FmtShort, mode), t.Vargen)
739+
sconv2(b, t.Sym, FmtShort, mode)
740+
fmt.Fprintf(b, "·%d", t.Vargen)
722741
return
723742
}
724-
b.WriteString(sconv(t.Sym, FmtShort, mode))
743+
sconv2(b, t.Sym, FmtShort, mode)
725744
return
726745
}
727746

728747
if mode == FTypeIdName {
729-
b.WriteString(sconv(t.Sym, FmtUnsigned, mode))
748+
sconv2(b, t.Sym, FmtUnsigned, mode)
730749
return
731750
}
732751

@@ -736,7 +755,7 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode fmtMode, visited
736755
}
737756
}
738757

739-
b.WriteString(smodeString(t.Sym, mode))
758+
sconv2(b, t.Sym, 0, mode)
740759
return
741760
}
742761

@@ -845,13 +864,13 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode fmtMode, visited
845864
// Wrong interface definitions may have types lacking a symbol.
846865
break
847866
case types.IsExported(f.Sym.Name):
848-
b.WriteString(sconv(f.Sym, FmtShort, mode))
867+
sconv2(b, f.Sym, FmtShort, mode)
849868
default:
850869
flag1 := FmtLeft
851870
if flag&FmtUnsigned != 0 {
852871
flag1 = FmtUnsigned
853872
}
854-
b.WriteString(sconv(f.Sym, flag1, mode))
873+
sconv2(b, f.Sym, flag1, mode)
855874
}
856875
tconv2(b, f.Type, FmtShort, mode, visited)
857876
}
@@ -941,7 +960,7 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode fmtMode, visited
941960
b.WriteString("undefined")
942961
if t.Sym != nil {
943962
b.WriteByte(' ')
944-
b.WriteString(smodeString(t.Sym, mode))
963+
sconv2(b, t.Sym, 0, mode)
945964
}
946965

947966
case TUNSAFEPTR:
@@ -1731,9 +1750,30 @@ func sconv(s *types.Sym, flag FmtFlag, mode fmtMode) string {
17311750
if s.Name == "_" {
17321751
return "_"
17331752
}
1753+
buf := fmtBufferPool.Get().(*bytes.Buffer)
1754+
buf.Reset()
1755+
defer fmtBufferPool.Put(buf)
1756+
1757+
flag, mode = flag.update(mode)
1758+
symfmt(buf, s, flag, mode)
1759+
return types.InternString(buf.Bytes())
1760+
}
1761+
1762+
func sconv2(b *bytes.Buffer, s *types.Sym, flag FmtFlag, mode fmtMode) {
1763+
if flag&FmtLong != 0 {
1764+
panic("linksymfmt")
1765+
}
1766+
if s == nil {
1767+
b.WriteString("<S>")
1768+
return
1769+
}
1770+
if s.Name == "_" {
1771+
b.WriteString("_")
1772+
return
1773+
}
17341774

17351775
flag, mode = flag.update(mode)
1736-
return symfmt(s, flag, mode)
1776+
symfmt(b, s, flag, mode)
17371777
}
17381778

17391779
func fldconv(b *bytes.Buffer, f *types.Field, flag FmtFlag, mode fmtMode, visited map[*types.Type]int, funarg types.Funarg) {

0 commit comments

Comments
 (0)