[recovery mode] Как ускорить программу на Go
Увы, я не веду свой бложик, а результат недавнего «открытия» обнародовать в виде заметки считаю необходимым. Полагаю, найдутся люди, которым это весьма пригодится.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/nullreal 0m4.612suser 0m4.588ssys 0m0.020s
# gccgo compiler without optimizations➜ go build -compiler gccgo ./dedup.go➜ time ./dedup > /dev/null
real 0m2.110suser 0m2.084ssys 0m0.024s
# PHP realization➜ time php hash.php > /dev/null
real 0m0.634suser 0m0.608ssys 0m0.024s
# gccgo with optimizations➜ go build -a -gccgoflags »-march=native -O3» -compiler gccgo ./dedup.go➜ time ./dedup > /dev/null
real 0m0.534suser 0m0.512ssys 0m0.020s
Итого время выполнения программы, собранной gccgo с оптимизациями, оказалось в 4.2–9.2 раза быстрее билда без оптимизаций.Сводная «табличка»:
Вариант Относительное время gccgo optimized 84% PHP 100% gccgo 350% gcompiler 750% На этом, в общем-то, всё, спасибо за внимание.