الحياة في سطر واحد

مرحبا خابروفيتس. لقد أعددنا لك ترجمة شيقة عشية بدء دورة "مطور Golang" .


إذا كان تقليل حجم ثنائيات Go بنسبة 6٪ هو ما تحتاجه بشدة ، فهذه المقالة تناسبك. (لقد أجريت هذه التجربة بمساعدة من Tailscale . لاحظ أنني مستثمر.) إذا كنت لا تهتم كثيرًا بالحجم الثنائي ، فقد تكون مهتمًا على الأقل بقراءة هذا من أجل المتعة.

للحصول على بعض الأرقام التقريبية لهذه المقالة ، حصلت على الملف الأول الذي صادفته من GOPATH. تشير جميع الأرقام المحددة في هذه المقالة إلى github.com/mvdan/sh/cmd/shfmt. بعد بعض التجارب ، يبدو أنها ممثلة جدًا لي.

أستخدم سلسلة أدوات Go الالتزام 9d812cfa5c كقاعدة الالتزام . هذا هو الفرع الرئيسي اعتبارًا من 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