Hallo Khabrovites. Wir haben am Vorabend des Starts des Kurses "Golang Developer" eine interessante Übersetzung für Sie vorbereitet .
Wenn Sie die Größe der Go-Binärdateien dringend um 6% reduzieren möchten, ist dieser Artikel genau das Richtige für Sie. (Ich habe dieses Experiment mit Hilfe von Tailscale durchgeführt . Beachten Sie, dass ich ein Investor bin.) Wenn Sie sich nicht zu sehr für die Binärgröße interessieren, könnten Sie zumindest daran interessiert sein, dies zum Spaß zu lesen.
Um einige grobe Zahlen für diesen Artikel zu erhalten, habe ich die erste Datei genommen, die mir von meinem GOPATH begegnet ist. Alle spezifischen Nummern in diesem Artikel beziehen sich auf github.com/mvdan/sh/cmd/shfmt
. Nach ein paar Experimenten scheinen sie mir ziemlich repräsentativ zu sein.
9d812cfa5c Go. master 29 2020 .; , Go 1.15beta1. , Go 1.14, , , , .
. , , . sync.Once. . (… , ). , : -ldflags=-w go build.
, . . , .
Go , . , Go. . . . ( .)
.
. .
. . , ( gofmt) , .
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground")
}
package main
import ( "fmt" ); func main() { fmt.Println("Hello, playground") }
Go , .
--- a/src/cmd/compile/internal/syntax/pos.go
+++ b/src/cmd/compile/internal/syntax/pos.go
@@ -23,3 +23,3 @@ type Pos struct {
// MakePos Pos PosBase, .
-func MakePos(base *PosBase, line, col uint) Pos { return Pos{base, sat32(line), sat32(col)} }
+func MakePos(base *PosBase, line, col uint) Pos { return Pos{base, 1, 1} }
@@ -101,2 +101,3 @@ type PosBase struct {
func NewFileBase(filename string) *PosBase {
+ filename = "x.go"
base := &PosBase{MakePos(nil, linebase, colbase), filename, linebase, colbase}
x.go
, 1. ( , DWARF).
. , , x.go:1:1
.
DWARF . : DWARF, DWARF .
- cgo. , cgo. (, ), .
https://github.com/josharian/go/commit/1a3e66ceed.
, , x.go:1:1
.
, -ldflags=-w
, 3,126,800 2,938,384 , 6%.
. - .
-:
func f(x []byte) {
_ = x[0]
_ = x[1]
}
func f(x []byte) {
_, _ = x[0], x[1]
}
go tool compile -S x.go
, , runtime.panicIndex
. . , runtime.panicIndex
, , . , . - , .
, , .
, ? , . - , , . . x.go:1
. , , . Pprof - , , , .
. , ? 0,9%. , , 1 5,1%.
, . , , 16? diff :
--- a/src/cmd/compile/internal/syntax/pos.go
+++ b/src/cmd/compile/internal/syntax/pos.go
@@ -23,3 +23,3 @@ type Pos struct {
// MakePos Pos PosBase, .
-func MakePos(base *PosBase, line, col uint) Pos { return Pos{base, 1, 1} }
+func MakePos(base PosBase, line, col uint) Pos { return Pos{base, sat32(line/1616 + 1), 1} }
2,2%. . , 16? , , , «» .
--- a/src/cmd/compile/internal/syntax/pos.go
+++ b/src/cmd/compile/internal/syntax/pos.go
@@ -23,3 +23,3 @@ type Pos struct {
// MakePos Pos PosBase, .
-func MakePos(base *PosBase, line, col uint) Pos { return Pos{base, 1, 1} }
+func MakePos(base *PosBase, line, col uint) Pos { return Pos{base, sat32(line/16 + 1), 1} }
2,75%! /16
0,5% , /16*16
?
varint . , .