Golang - это язык программирования, разработанный в Google командой Роберта Гриземера, Роба Пайка и Кена Томпсона, выделяющийся лаконичным синтаксисом и простой изучения. При этом данный язык программирования обеспечивает высокую производительность за счет компиляции, строгой типизации, встроенной поддержке параллелизма и сборке мусора.
По мимо вышеперечисленного, в Go представлен ряд полезных возможностей для оптимизации. Ключевой особенностью является встроенная поддержка параллелизма посредством легковесных потоков - горутин, с помощью которых можно эффективно использовать ресурсы многоядерных процессоров. Горутины используются при процессе параллельности, который позволяет выполнять несколько задач одновременно.
Горутины - это легковесные потоки, управляемые средой выполнения Go. Для создания горутины необходимо использовать ключевое слово (“go”) перед вызовом функции (“go funcName()”). Правильное использование горутин позволяет горутинам безопасно взаимодействовать и устраняет условия гонки. Когда горутина запускается, используется то же адресное пространство, что и другие горутины, что упрощает их взаимодействие.
Каналы – это типизированный поток, использующийся для основной способ обмена данными между горутинами. Канал создается с помощью ключевого слова (“chan”). Для отправки и получения данных через канал используется оператор стрелки (“<-“).
Для того чтобы оценить эффективность оптимизации на Go, нужно провести необходимые тесты.
Для примера будет использован код, выполняющий функцию суммирования числа 1 от N.

Изображение 1. Последовательный код

Изображение 2. Код с использованием горутин и каналов
Таблица 1.
Сравнение последовательного кода и кода с использованием горутин
|
Критерий |
Последовательный код |
Код с горутинами |
|
Производительность |
Выполняется в одной горутине, из-за чего подвергнется замедлению при большом объеме данных |
Выполняется в нескольких горутинах впоследствии чего не будет подвержен замедлению |
|
Читаемость и поддерживаемость |
Проще для понимания, логика операций ясна |
Сложнее для понимания. Требует понимание горутин и каналов |
|
Количество используемой памяти |
Использует определенное количество памяти для суммы и переменных |
В зависимости от структуры задачи может потребоваться дополнительные ресурсы для хранения нескольких горутин |
|
Обработка ошибок |
Обработка ошибок отсутствует |
Присутствует обработка ошибок с возможностью использования канала для их передачи |
|
Гибкость |
Изменения в параметрах выполнения сложны |
Имеет повышенную гибкость, позволяет изменять количество параллельных задач для адаптации к условиям поставленной задачи |
В ходе исследования было выявлено, что применение оптимизации значительно влияет на код. Код, содержащий в себе оптимизацию, имеет повышенную гибкость, улучшенную производительность и улучшенную гибкость.
Список литературы
- Оптимизация производительности: https://appmaster.io/ru/blog/optimizatsiia-proizvoditel-nosti-golang
- Goroutines: https://appmaster.io/ru/blog/goroutines-ru
- Гольцман А. А. Оптимизация проектов на Go: https://purpleschool.ru/knowledge-base/article/project-optimization
- Denver 83 Горутины: что это и как работают: https://proglib.io/p/gorutiny-chto-takoe-i-kak-rabotayut-2022-07-31


