Я выполнил программу Hello World Go, которая генерировала собственный исполняемый файл на моей Linux-машине. Но я был удивлен, увидев размер простой программы Hello world Go, он составлял 1,9 МБ!
Почему исполняемый файл такой простой программы на Go так велик?
go
executable
Картик Рао
источник
источник
dotnet publish -r win-x64 -p:publishsinglefile=true -p:publishreadytorun=true -p:publishtrimmed=true
сгенерирует двоичный файл размером ~ 26 МБ!Ответы:
Этот точный вопрос появляется в официальном FAQ: Почему моя простая программа имеет такой большой двоичный файл?
Цитируя ответ:
Таким образом, размер собственного исполняемого файла Hello World составляет 1,9 МБ, потому что он содержит среду выполнения, которая обеспечивает сборку мусора, отражение и многие другие функции (которые ваша программа на самом деле может не использовать, но она есть). И реализация
fmt
пакета, который вы использовали для печати"Hello World"
текста (плюс его зависимости).Теперь попробуйте следующее: добавьте еще одну
fmt.Println("Hello World! Again")
строку в свою программу и снова скомпилируйте ее. В результате получится не 2x 1,9 МБ, а всего 1,9 МБ! Да, потому что все используемые библиотеки (fmt
и их зависимости) и среда выполнения уже добавлены в исполняемый файл (и поэтому будет добавлено еще несколько байтов для печати второго текста, который вы только что добавили).источник
Рассмотрим следующую программу:
package main import "fmt" func main() { fmt.Println("Hello World!") }
Если я построю это на своей машине Linux AMD64 (Go 1.9), например:
$ go build $ ls -la helloworld -rwxr-xr-x 1 janf group 2029206 Sep 11 16:58 helloworld
Я получаю двоичный файл размером около 2 МБ.
Причина этого (которая была объяснена в других ответах) заключается в том, что мы используем довольно большой пакет «fmt», но двоичный файл также не был удален, и это означает, что таблица символов все еще существует. Если вместо этого мы укажем компилятору удалить двоичный файл, он станет намного меньше:
$ go build -ldflags "-s -w" $ ls -la helloworld -rwxr-xr-x 1 janf group 1323616 Sep 11 17:01 helloworld
Однако, если мы перепишем программу, чтобы использовать встроенную функцию print вместо fmt.Println, например:
package main func main() { print("Hello World!\n") }
А затем скомпилируйте его:
$ go build -ldflags "-s -w" $ ls -la helloworld -rwxr-xr-x 1 janf group 714176 Sep 11 17:06 helloworld
Мы получаем еще меньший двоичный файл. Это настолько мало, насколько мы можем получить, не прибегая к уловкам вроде UPX-упаковки, поэтому накладные расходы Go-runtime составляют примерно 700 Кбайт.
источник
Обратите внимание, что проблема с размером двоичного файла отслеживается проблемой 6853 в проекте golang / go .
Например, команда commit a26c01a (для Go 1.4) сократила привет, мир на 70 КБ :
Учитывая, что компилятор, ассемблер, компоновщик и среда выполнения для 1.5 будут полностью на Go, вы можете ожидать дальнейшей оптимизации.
Обновление 2016 Go 1.7: это было оптимизировано: см. « Меньшие двоичные файлы Go 1.7 ».
Но в этот день (апрель 2019 года) больше всего места занимает
runtime.pclntab
.См. « Почему мои исполняемые файлы Go такие большие? Визуализация размера исполняемых файлов Go с использованием D3 » от Рафаэля 'kena' Poss .
источник