Я уверен, что все, кто знает golang
, знают, что запись в блоге здесь .
Прочитав это снова, я подумал, что использование gccgo
вместо go build
увеличит скорость еще немного. В моем типичном случае использования (научные вычисления) двоичный файл, сгенерированный gccgo
, всегда быстрее, чем двоичный файл, сгенерированный go build
.
Итак, просто скачайте этот файл: havlak6.go. и скомпилируйте его:
go build havlak6.go -O havlak6_go
gccgo -o havlak6_gccgo -march=native -Ofast havlak6.go
Сюрприз!
$/usr/bin/time ./havlak6_go
5.45user 0.06system 0:05.54elapsed 99%CPU
$/usr/bin/time ./havlak6_gccgo
11.38user 0.16system 0:11.74elapsed 98%CPU
Мне любопытно, и я хочу знать, почему «оптимизирующий» компилятор производит более медленный код.
Я попытался использовать gprof
для gccgo
сгенерированного двоичного файла:
gccgo -pg -march=native -Ofast havlak6.go
./a.out
gprof a.out gmon.out
без везения:
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
Как видите, код фактически не был профилирован.
Конечно, я читал это, но, как видите, программа берет 10+ секунд на выполнение... Количество образцов должно быть > 1000.
Я также пробовал:
rm a.out gmon.out
LDFLAGS='-g -pg' gccgo -g -pg -march=native -Ofast havlak6.go
./a.out
gprof
Нет и успеха.
Вы знаете, что случилось? У вас есть идея, почему gccgo
со всеми его процедурами оптимизации не может быть быстрее, чем gc
в этом случае?
go
версия: 1.0.2 gcc
версия: 4.7.2
ИЗМЕНИТЬ:
О, совсем забыл упомянуть... Очевидно, я попробовал pprof на двоичном файле, сгенерированном gccgo
... Вот top10
:
Welcome to pprof! For help, type 'help'.
(pprof) top10
Total: 1143 samples
1143 100.0% 100.0% 1143 100.0% 0x00007fbfb04cf1f4
0 0.0% 100.0% 890 77.9% 0x00007fbfaf81101e
0 0.0% 100.0% 4 0.3% 0x00007fbfaf8deb64
0 0.0% 100.0% 1 0.1% 0x00007fbfaf8f2faf
0 0.0% 100.0% 3 0.3% 0x00007fbfaf8f2fc5
0 0.0% 100.0% 1 0.1% 0x00007fbfaf8f2fc9
0 0.0% 100.0% 1 0.1% 0x00007fbfaf8f2fd6
0 0.0% 100.0% 1 0.1% 0x00007fbfaf8f2fdf
0 0.0% 100.0% 2 0.2% 0x00007fbfaf8f4a2f
0 0.0% 100.0% 1 0.1% 0x00007fbfaf8f4a33
И именно поэтому я ищу что-то еще.
EDIT2:
Так как кажется, что кто-то хочет, чтобы мой вопрос был закрыт, я не стал использовать gprof
на ровном месте: https://groups.google.com/d/msg/golang-nuts/1xESoT5Xcd0/bpMvxQeJguMJ