предисловие
Официальная команда Go выпустила версию Go 1.20 rc1 (кандидат на выпуск) 2022.12.08, а официальный выпуск версии Go 1.20 ожидается в феврале 2023 года.
Давайте бросим беглый взгляд и посмотрим, какие изменения принесет нам Go 1.20.
способ установки:
$ go install golang.org/dl/go1.20rc1@latest
$ go1.20rc1 download
Это третья часть подробного объяснения содержания обновления версии Go 1.20. Вы можете обратить внимание на официальный аккаунт и вовремя получить последнее обновление этой серии.
Контрольный список выпуска Go 1.20
По сравнению с Go 1.19 изменения умеренные, в основном затрагивающие язык (Language), переносимость (Ports), цепочку инструментов (Go Tools), среду выполнения (Runtime), компилятор (Compiler), ассемблер (Assembler), ссылку Оптимизация компоновщика и ядра библиотека.
Первая статья в основном посвящена оптимизации Go 1.20 с точки зрения языка и переносимости.Исходная текстовая ссылка: Go 1.20 Version Upgrade Content Part 1 .
Вторая часть в основном связана с оптимизацией команд Go и цепочек инструментов Ссылка на исходный текст: Go 1.20 version update content part 2 .
Эта статья посвящена оптимизации Go 1.20 в среде выполнения, компиляторе, ассемблере и компоновщике.
Время выполнения
Среда выполнения версии 1.20 Go добавляет экспериментальную поддержку новой функции выделения памяти арены, которая позволяет программам Go освобождать больше места в памяти и экономить использование памяти.
Если вы хотите узнать, что такое распределение памяти арены, вы можете обратиться к: https://github.com/golang/go/issues/51317.
Если распределение памяти по области используется правильно, это может повысить производительность ЦП до 15 % для приложений, требующих частого выделения памяти.
Способ использования заключается в добавлении GOEXPERIMENT=arenas
параметров . Если он есть в коде import arena
, вам также нужно добавить этот параметр компиляции.
Кроме того, был оптимизирован дизайн некоторых внутренних структур данных сборщика мусора, который более эффективен с точки зрения времени и пространства, может сэкономить накладные расходы памяти и повысить общую производительность ЦП примерно на 2%.
Go 1.20 также добавляет новый runtime/coverage
пакет. Вызов API этого пакета может вывести данные о покрытии кода запущенной программы в указанный файл.
Компилятор
Go 1.20 добавляет функцию PGO (оптимизация на основе профиля), которая может помочь разработчикам оптимизировать производительность программы.
В настоящее время компилятор поддерживает профили ЦП pprof, и этот тип профиля можно получить, например, через runtime/pprof
collection net/http/pprof
.
Если вы хотите включить PGO, go build
вам нужно добавить параметры при использовании компилятора -pgo
. -pgo
Указывает путь к файлу профиля. Если это так -pgo=auto
, команда go найдет файл, указанный в пути к основному пакету default.pgo
. -pgo=off
Оптимизацию можно отключить. Для получения подробной информации см.: Предложение PGO .
Если используется PGO, компилятор будет использовать больше встроенных функций для оптимизации производительности вызываемых функций.
Тест производительности показывает, что если включена оптимизация встраивания на основе профиля, производительность может быть улучшена на 3-4%, а позже Go добавит больше поддержки оптимизации PGO.
Обратите внимание: поскольку PGO не является стабильной версией, будьте осторожны при ее использовании в производственной среде.
Кроме того, начиная с Go 1.20 компилятор запрещает вложение анонимных интерфейсов, и следующий код не скомпилируется.
type I interface {
m() interface {
I
}
}
Линкер
В среде Linux компоновщик выберет динамический интерпретатор для glibc
или во время операции компоновки .musl
В Windows компоновщик теперь поддерживает цепочки инструментов C на основе LLVM.
Начиная с версии 1.20 Go, используйте go:
и type:
в качестве префикса для символов, сгенерированных компилятором, и откажитесь от использования go.
и type.
в качестве префикса.
Это поможет избежать двусмысленности, поскольку имена некоторых пакетов go go.
начинаются с .
Начальная загрузка
Если вы хотите скомпилировать исходный код самого языка Go, вы должны установить GOROOT_BOOTSTRAP
переменные среды.
Начиная с версии 1.4 в языке Go реализована самозагрузка, то есть версию 1.4 можно использовать для компиляции компилятора установленной версии.
Предполагая, что GOROOT_BOOTSTRAP
переменная среды не установлена, Go 1.17 и более ранние версии попытаются найти Go 1.4 или более новую цепочку инструментов начальной загрузки $HOME/go1.4
( в Windows).%HOMEDRIVE%%HOMEPATH%\go1.4
Go 1.18 и Go 1.19 сначала будут искать $HOME/go1.17
или $HOME/sdk/go1.17
, а если не найдут резервный вариант $HOME/go1.4
.
Чтобы Go 1.20 реализовал загрузку, он должен полагаться на последнюю подверсию Go 1.17, которая является версией Go 1.17.13.
Go 1.20 будет искать сначала $HOME/go1.17.13
или $HOME/sdk/go1.17.13
, если не найдет, откатится $HOME/go1.4
.
В будущем официальные лица Go будут продвигать цепочку инструментов начальной загрузки на один шаг вперед каждый год. Ожидается, что Go 1.22 потребует последней подрывной версии Go 1.20, которая будет использоваться для начальной загрузки Go 1.22.
Подведем итог
В следующей статье будет представлена работа по оптимизации Go 1.20 в основной библиотеке.Есть некоторые вещи, которые стоит изучить, и вы можете следить за обновлениями.
рекомендуемое чтение
-
Пройдите серию вопросов для интервью, посмотрите, сколько вопросов вы можете задать
-
Перейти к серии статей о распространенных ошибках и рекомендациях
адрес с открытым исходным кодом
Статьи и примеры кода с открытым исходным кодом доступны на GitHub: Go Language Beginner, Intermediate и Advanced Tutorials .
Официальный аккаунт: расширенное кодирование. Подпишитесь на официальную учетную запись, чтобы получать последние вопросы интервью Go и стек технологий.
Персональный сайт: Блог Цзиньчэна .
Чжиху: Уцзи .
Благосостояние
Я собрал для вас подарочный набор учебных материалов по бэкенд-разработке, включая введение в языки программирования для углубленного изучения (Go, C++, Python), стек технологий бэкенд-разработки, вопросы для интервью и т. д.
Подпишитесь на общедоступную учетную запись «продвинутое кодирование», отправьте сообщение на серверную часть , чтобы получить пакет данных, эти данные будут время от времени обновляться, и добавляйте данные, которые я считаю ценными. Вы также можете отправить сообщение « Присоединяйтесь к группе », чтобы общаться и учиться со своими сверстниками, а также отвечать на вопросы.
Рекомендации
- https://tip.golang.org/doc/go1.20