- PVSM.RU - https://www.pvsm.ru -

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

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

Go — язык, компилируемый в нативный код, а посему, очевидно, должен быть быстрым. Однако, к сожалению, на данный момент это далеко не всегда соответствует действительности [1].
В моём же случае, Go проиграл PHP [2] (ну, почти 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

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/news/59907

Ссылки в тексте:

[1] не всегда соответствует действительности: http://stackoverflow.com/questions/2704417/why-is-go-language-so-slow

[2] Go проиграл PHP: https://github.com/jzelinskie/whirlpool/issues/1

[3] Источник: http://habrahabr.ru/post/222957/