Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
I've profiled the «go build» variant of program (same run time with profiling code) and saw, that 94.1% of time program was in
github.com/jzelinskie/whirlpool.(*whirlpool).transform
The most obvious is that gccgo uses operating system threads to implement goroutines, and will not use segmented stacks in all configurations. This means that creating a goroutine is as expensive as creating a thread in C.
The gccgo compiler implements segmented stacks on Linux only, supported by recent modifications to the gold linker.
gold замест ld (в binutils 2.22+ он есть). У меня gccgo собран из сырья, версия 4.10.0 20140719 (experimental). Рекомендую, т.к. более новая. Насчёт флагов я лично не мелочусь:go build -compiler gccgo -gccgoflags "-march=native -Ofast -pipe -fomit-frame-pointer -fuse-ld=gold -Wl,--strip-all"
-Wl,--strip-all) портит всё. Сама по себе опция -Ofast считается не рекомендуемой (gentoo вики), а вот насчёт -O3 vs. -O2 скажу прямо — используйте -O3 для узких мест не стесняясь. Мои исследования ассемблерного листинга с этими флагами показали меньший размер и эффективное использование хвостовой рекурсии с флагом -O3. Не мешало бы добавить, что простора для жёсткого «инлайнинга» в моём примере у компилятора не было (что значит, при иных раскладах размер может и увеличиться).syscall, то gccgo (упомянутых выше версий) выдаст ошибку — такие пакеты компилируются только golang-go (или нужно подождать патчей). Ну и разумеется не получиться использовать плюшки go 1.4 (что впрочем не сильно напрягает).
Как ускорить программу на Go