Увы, я не веду свой бложик, а результат недавнего «открытия» обнародовать в виде заметки считаю необходимым. Полагаю, найдутся люди, которым это весьма пригодится.
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.
Результаты тестирования для моего случая:
➜ 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