Почему gccgo медленнее, чем gc в этом конкретном случае?
Я уверен, что все знают 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.2gcc
версия: 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
2 ответа
Запуск сгенерированного gccgo двоичного файла под Valgrind, кажется, указывает на то, что gccgo
имеет неэффективный распределитель памяти. Это может быть одной из причин, почему gccgo
4.7.2 медленнее, чем go
1.0.2. Невозможно запустить двоичный файл, сгенерированный go 1.0.2 под Valgrind, поэтому трудно с уверенностью подтвердить, является ли выделение памяти основной проблемой производительности gccgo в этом случае.
Помните go build
также по умолчанию статическое связывание, так что для сравнения яблок с яблоками вы должны дать gccgo -static
или же -static-libgo
вариант.