From 4ee934ad27dcd2fb0c28798cb329841a2a444fb1 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 22 Apr 2017 18:59:11 -0700 Subject: [PATCH] cmd/compile: remove references to *os.File from ssa package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reduces the size of the ssa export data by 10%, from 76154 to 67886. It doesn't appear that #20084, which would do this automatically, is going to be fixed soon. Do it manually for now. This speeds up compiling cmd/compile/internal/amd64 and presumably its comrades as well: name old time/op new time/op delta CompileAMD64 89.6ms ± 6% 86.7ms ± 5% -3.29% (p=0.000 n=49+47) name old user-time/op new user-time/op delta CompileAMD64 116ms ± 5% 112ms ± 5% -3.51% (p=0.000 n=45+42) name old alloc/op new alloc/op delta CompileAMD64 26.7MB ± 0% 25.8MB ± 0% -3.26% (p=0.008 n=5+5) name old allocs/op new allocs/op delta CompileAMD64 223k ± 0% 213k ± 0% -4.46% (p=0.008 n=5+5) Updates #20084 Change-Id: I49e8951c5bfce63ad2b7f4fc3bfa0868c53114f9 Reviewed-on: https://go-review.googlesource.com/41493 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/ssa/func.go | 13 +++++++++---- src/cmd/compile/internal/ssa/html.go | 18 +++++++++--------- src/cmd/compile/internal/ssa/rewrite.go | 3 ++- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/cmd/compile/internal/ssa/func.go b/src/cmd/compile/internal/ssa/func.go index 5093d0e7fc..64f67b4633 100644 --- a/src/cmd/compile/internal/ssa/func.go +++ b/src/cmd/compile/internal/ssa/func.go @@ -8,11 +8,17 @@ import ( "cmd/internal/src" "crypto/sha1" "fmt" + "io" "math" "os" "strings" ) +type writeSyncer interface { + io.Writer + Sync() error +} + // A Func represents a Go func declaration (or function literal) and its body. // This package compiles each Func independently. // Funcs are single-use; a new Func must be created for every compiled function. @@ -30,7 +36,7 @@ type Func struct { // Given an environment variable used for debug hash match, // what file (if any) receives the yes/no logging? - logfiles map[string]*os.File + logfiles map[string]writeSyncer HTMLWriter *HTMLWriter // html writer, for debugging DebugTest bool // default true unless $GOSSAHASH != ""; as a debugging aid, make new code conditional on this and use GOSSAHASH to binary search for failing cases @@ -590,7 +596,7 @@ func (f *Func) DebugHashMatch(evname, name string) bool { func (f *Func) logDebugHashMatch(evname, name string) { if f.logfiles == nil { - f.logfiles = make(map[string]*os.File) + f.logfiles = make(map[string]writeSyncer) } file := f.logfiles[evname] if file == nil { @@ -604,8 +610,7 @@ func (f *Func) logDebugHashMatch(evname, name string) { } f.logfiles[evname] = file } - s := fmt.Sprintf("%s triggered %s\n", evname, name) - file.WriteString(s) + fmt.Fprintf(file, "%s triggered %s\n", evname, name) file.Sync() } diff --git a/src/cmd/compile/internal/ssa/html.go b/src/cmd/compile/internal/ssa/html.go index 28538245d5..e98c5dc460 100644 --- a/src/cmd/compile/internal/ssa/html.go +++ b/src/cmd/compile/internal/ssa/html.go @@ -15,7 +15,7 @@ import ( type HTMLWriter struct { Logger - *os.File + w io.WriteCloser } func NewHTMLWriter(path string, logger Logger, funcname string) *HTMLWriter { @@ -23,7 +23,7 @@ func NewHTMLWriter(path string, logger Logger, funcname string) *HTMLWriter { if err != nil { logger.Fatalf(src.NoXPos, "%v", err) } - html := HTMLWriter{File: out, Logger: logger} + html := HTMLWriter{w: out, Logger: logger} html.start(funcname) return &html } @@ -299,11 +299,11 @@ func (w *HTMLWriter) Close() { if w == nil { return } - w.WriteString("") - w.WriteString("") - w.WriteString("") - w.WriteString("") - w.File.Close() + io.WriteString(w.w, "") + io.WriteString(w.w, "") + io.WriteString(w.w, "") + io.WriteString(w.w, "") + w.w.Close() } // WriteFunc writes f in a column headed by title. @@ -328,13 +328,13 @@ func (w *HTMLWriter) WriteColumn(title string, html string) { } func (w *HTMLWriter) Printf(msg string, v ...interface{}) { - if _, err := fmt.Fprintf(w.File, msg, v...); err != nil { + if _, err := fmt.Fprintf(w.w, msg, v...); err != nil { w.Fatalf(src.NoXPos, "%v", err) } } func (w *HTMLWriter) WriteString(s string) { - if _, err := w.File.WriteString(s); err != nil { + if _, err := io.WriteString(w.w, s); err != nil { w.Fatalf(src.NoXPos, "%v", err) } } diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 5dce8affdb..68f3a675a6 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -7,6 +7,7 @@ package ssa import ( "cmd/internal/obj" "fmt" + "io" "math" "os" "path/filepath" @@ -561,7 +562,7 @@ func logRule(s string) { } } -var ruleFile *os.File +var ruleFile io.Writer func min(x, y int64) int64 { if x < y {