こんにちは、Khabrovites。「GolangDeveloper」コースの開始前夜に、興味深い翻訳を用意しました。
Goバイナリのサイズを6%削減することがどうしても必要な場合は、この記事が最適です。(私はTailscaleの助けを借りてこの実験を行いました。私は投資家であることに注意してください。)バイナリサイズをあまり気にしないのであれば、少なくとも楽しみのためにこれを読むことに興味があるかもしれません。
この記事の大まかな数値を取得するために、GOPATHから最初に見つけたファイルを取得しました。この記事のすべての特定の番号はを参照していgithub.com/mvdan/sh/cmd/shfmt
ます。いくつかの実験の後、それらは私にとってかなり代表的なようです。
基本コミットとしてGoツールチェーンコミット9d812cfa5cを使用します。これは2020年4月29日現在のマスターブランチです。おそらくGo1.15beta1に似ています。 Go 1.14ではなく、これを使用しています。これには、特定の1つを含む、バイナリのいくつかのサイズ縮小が含まれているためです。サイズが重要な場合は、必ず必要になります。
. , , . 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 . , .