Новые возможности Go 1.17, почему скорость работы программы увеличилась на 5~10%?

задняя часть Go

Поиск в WeChat【Жареная рыба с мозгами] Обратите внимание на эту жареную рыбу с печенью. эта статьяGitHub GitHub.com/Vicious Genetics/Нет...В комплекте с моей серией статей, материалов и книг по Go с открытым исходным кодом.

Всем привет, я жареная рыба.

После выпуска Go1.17 мы были приятно удивлены, обнаружив, что язык Go снова оптимизирован, улучшенный компилятор дал прирост производительности примерно на 5%, при этом отсутствуют деструктивные изменения, обеспечивающие совместимость вперед.

Что он сделал, он, кажется, не видел много упоминаний об этом. По этой причине сегодня я предлагаю вам интерпретировать два новых предложения:

Эта статья объяснит и разберет на основе предложения, ведь обмен новыми знаниями должен начинаться с официальных данных как фактического ориентира.

задний план

В предыдущих версиях Go соглашение о вызовах Go было простым и почти универсальным для разных платформ, потому что было выбрано соглашение о вызовах стека, основанное на Plan9 ABI, т. е.Параметры функции и возвращаемые значения передаются в стеке.

Здесь мы упомянули Plan9 и ABI, две ключевые концепции:

  • Plan9: Ассемблер, используемый языком Go, Роб Пайк — парень из Bell Labs.
  • ABI: Application Binary Interface (Двоичный интерфейс приложения). ABI содержит соглашения по программированию (например, двоичный интерфейс), которым должны следовать приложения при работе в операционной системе.

Преимущества и недостатки этой схемы следующие:

  • Преимущества: Простое внедрение и упрощенная стоимость внедрения.
  • Недостаток: есть цена, которую нужно заплатить с точки зрения производительности.

Насколько я понимаю, на заре существования языка Go сначала была принята простая реализация, а потом уже запущена. Это также разумно, производительность не является требованием TOP1.

Оптимизация Go1.17

Что такое соглашение о вызовах

В новой версии оптимизации упоминается понятие соглашения о вызовах, которое относится кСогласованное соглашение между вызывающим и вызываемым для вызовов функций.

Эти консенсусы включают в себя: параметры функции, возвращаемые значения, порядок передачи параметров, методы передачи и т. д.

Когда обе стороны должны следовать этому соглашению, функции программы могут работать нормально. Если его не соблюдать, функция работать не будет.

что такое оптимизация

Начиная с Go 1.17, внутренняя спецификация Go ABI (используемая между функциями Go) будет официально передаваться из аргументов и результатов функций на основе стека.Изменены аргументы функций на основе регистров и передача результатов..

Эта модификация включает в себя много пунктов, и оптимизация продолжается, изначально предполагалось, что она будет реализована в Go1.16, но она была отложена до Go1.17.

На данный момент реализована поддержка архитектур amd64 и arm64. Есть еще много поддержек, которые будут дорабатываться в Go1.18, конкретный прогресс можно увидетьissues #40724.

Как производительность

существуетGo1.17 Release NotesЭто четко указано в бенчмарках с репрезентативным набором пакетов и программ Go.

Официальные данные показывают:

  • Программы Go работают примерно на 5% быстрее.
  • Уменьшение размера скомпилированных Go двоичных файлов составляет около 2%.

Что касается личных данных, то вtwitterПосмотрите, что сказал @Achille после обновления с Go1.15.7 до Go1.17. Обновление Go1.17 для крупномасштабной системы обработки данных дало удивительные результаты, давайте посмотрим на его реальные данные.

Процессор, время вызова Malloc уменьшено примерно на 15%:

图来自 @Achille

图来自 @Achille

Размер RSS ближе к размеру кучи:

图来自 @Achille

Уменьшено с 1,6 ГБ до 1 ГБ.

Сочетая официальные и частные данные, эффект оптимизации очевиден и эффективен. Заинтересованные друзья также могут проверить это на себе.

Суммировать

В новой версии Go1.17 мы можем получить определенную оптимизацию производительности, просто обновив версию Go на один литр, что очень хорошо.

От предыдущего метода передачи параметров функции и результата на основе стека до параметров функции и результата на основе регистров Go1.17~Go1.18 язык Go шаг за шагом становится лучше!

Что вы думаете?

Если у вас есть какие-либо вопросы, пожалуйста, оставьте отзыв и обменяйтесь мнениями в области комментариев.Лучшие отношения - это достигать друг друга, твойподобното естьжареная рыбаСамая большая мотивация для творчества, спасибо за поддержку.

Статья постоянно обновляется, вы можете выполнить поиск [рыба, жареная в мозгу] на WeChat, чтобы прочитать, ответить [000] Готовые мной решения и материалы по вопросам алгоритма заводского собеседования первой линии, эта статьяGitHub GitHub.com/Vicious Genetics/Нет...Он был включен, добро пожаловать в Star, чтобы призвать больше.