Как ускорить программу на Go

в 15:19, , рубрики: Без рубрики

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

Go — язык, компилируемый в нативный код, а посему, очевидно, должен быть быстрым. Однако, к сожалению, на данный момент это далеко не всегда соответствует действительности.
В моём же случае, Go проиграл PHP (ну, почти PHP). Если кратко, то при вычислении Whirlpool-хеша Go проигрывал в 3,5-7.5 раз!

Во множестве источников описывается одна и та же причина — «слабый» стандартный компилятор Go (тот, что вызывается через go build). Это полностью верно. Дело в том, что компилятор довольно «молодой» и пока не имеет багажа оптимизаций, какой, например, имеет GCC.
Решение есть — существует вариант компилятора Go — gccgo.
Сборка программы через gccgo с оптимизациями производится так:
go build -compiler gccgo -gccgoflags "-march=native -O3" main.go
В данном случае будет выполнена сборка со всеми доступными оптимизациями и инструкциями на текущем оборудовании.
В целом, достаточно использовать только опцию -O2.

Результаты тестирования для моего случая:

Скрытый текст

# Standart compiler
➜ go build ./dedup.go
➜ time ./dedup > /dev/null

real 0m4.612s
user 0m4.588s
sys 0m0.020s

# gccgo compiler without optimizations
➜ go build -compiler gccgo ./dedup.go
➜ time ./dedup > /dev/null

real 0m2.110s
user 0m2.084s
sys 0m0.024s

# PHP realization
➜ time php hash.php > /dev/null

real 0m0.634s
user 0m0.608s
sys 0m0.024s

# gccgo with optimizations
➜ go build -a -gccgoflags "-march=native -O3" -compiler gccgo ./dedup.go
➜ time ./dedup > /dev/null

real 0m0.534s
user 0m0.512s
sys 0m0.020s

Итого время выполнения программы, собранной gccgo с оптимизациями, оказалось в 4.2-9.2 раза быстрее билда без оптимизаций.
Сводная «табличка»:

Вариант Относительное время
gccgo optimized 84%
PHP 100%
gccgo 350%
gcompiler 750%

На этом, в общем-то, всё, спасибо за внимание.

Автор: KawaiDesu

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js