Vida en una linea

Hola, Khabrovites. Hemos preparado una traducción interesante para usted la víspera del inicio del curso "Golang Developer" .


Si lo que necesita desesperadamente es reducir el tamaño de los binarios de Go en un 6%, este artículo es para usted. (Hice este experimento con la ayuda de Tailscale . Tenga en cuenta que soy un inversor). Si no le importa demasiado el tamaño de los binarios, bueno, al menos podría estar interesado en leer esto por diversión.

Para obtener algunas cifras aproximadas de este artículo, tomé el primer archivo que encontré de mi GOPATH. Todos los números específicos de este artículo se refieren a github.com/mvdan/sh/cmd/shfmt. Después de algunos experimentos, me parecen bastante representativos.

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 , .

, -toolexec //line, . , , .

--- 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 . , .


, , .


:




All Articles