2013-02-25 1 views
6

나는 모두 golang을 아는 모두가 여기 blog post을 알고 있다고 확신합니다.그 특별한 경우에 gccgo가 gc보다 느린 이유는 무엇입니까?

다시 읽어 보면 go build 대신 gccgo을 사용하면 속도가 조금 더 빨라질지 궁금했습니다. 일반적인 사용 예 (과학 계산)에서는 gccgo으로 생성 된 바이너리가 항상 go build 생성 된 것보다 빠릅니다. havlak6.go을하고 컴파일 :

그래서, 그냥이 파일을 잡아

go build havlak6.go -O havlak6_go 
gccgo -o havlak6_gccgo -march=native -Ofast havlak6.go 

서프라이즈!

"최적화"컴파일러가 느린 코드를 생성하는 이유가 궁금하고 궁금합니다. 행운과

gccgo -pg -march=native -Ofast havlak6.go 
./a.out 
gprof a.out gmon.out 

:

나는 gccgo 생성 된 바이너리에 gprof을 사용하려고

Flat profile: 

Each sample counts as 0.01 seconds. 
no time accumulated 

코드가 실제로 프로파일되지 않은 당신이 볼 수 있듯이. 물론

, 나는 this를 읽을 수 있지만 당신이 볼 수있는 프로그램이 실행 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

편집 :

아, 나는 완전히 나는 분명히 gccgo -generated 진에 pprof을 시도 ... 언급하는 것을 잊었다. .. 여기 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

+0

사람들은 여전히 ​​[gprof를 표준 프로파일 러로 믿고 있습니다.] (http://stackoverflow.com/a/1779343/23771). 몇 가지 포인트 : 1) gprof는 반복 호출이없는 얕은 호출 스택을 가진 CPU 바운드 프로그램에만 유용합니다.이 프로그램에는 모든 기호가 있습니다. 2) 컴파일러 최적화는 코드에서 메모리 할당과 같은 함수를 호출하지 않는 많은 내부적 인 루프 또는 루틴을 변경합니다. 컴파일러 최적화만으로 모든 것이 더 빨라지지는 않습니다. –

+0

예, gprof를 얻었습니다. 그리고 저는 여러분에게 컴파일러 최적화에 관해 동의합니다. 그러나 최적화가 가능한 컴파일러로 인해 성능이 저하 될 것으로 예상하지는 않습니다. 공연은 동등하거나 그 이상이어야합니다. 그렇지 않다면 개선의 여지가 있습니다. 이유를 이해하고 싶습니다. –

+0

내가 수행 할 수있는 유일한 타이밍은 종단 간이며, 아마도 10^n 번 반복되어 나뉘어져 있습니다. 3 자리 이상의 정확도. 소음이 있고 나는 상관하지 않는다. 그런 다음 무작위 일시 중지를 사용하여 더 빠르게 만드는 방법을 찾습니다. 이미 스폰지처럼 짜내 지 않는 한, 나는 길을 찾을 것이고, 나는 그것을 또 다시 할 수있다. 몇 번의 사이클을 거쳐 수익이 감소하고 PC가 가장 많이 생성 된 지침에 따라 최적화되면 최적화 프로그램이 켜져 10 % 빨라집니다. 야단법석. –

답변

2

Valgrind의 보이는 아래 gccgo 생성 된 바이너리를 실행 gccgo에 비효율적 인 메모리 할당자가 있음을 나타냅니다. 이것은 gccgo 4.7.2가 go 1.0.2보다 느린 이유 중 하나 일 수 있습니다. go 1.0으로 생성 된 바이너리를 실행하는 것은 불가능합니다.2를 Valgrind에서 사용하기 때문에이 경우 메모리 할당이 gccgo의 주요 성능 문제인지 여부를 확인하는 것은 어렵습니다.

+0

Valgrind를 언급 해 주셔서 감사합니다. Gprof가 프로파일 러 였지만 프로파일 링을 시작한 것은 처음이었습니다 ... 저는 틀 렸습니다 :) 그러나 Valgrind는 C 전용 프로파일 러/프로파일 링 프레임 워크 인 것으로 보입니다. 그것은 초기화되지 않은 가치에 대해 불평하고 "전혀"가지 않는 것처럼 보입니다 ... 조금 더 자세히 설명해 주시겠습니까? –

+0

'valgrind --tool = callgrind'와 KCacheGrind를 사용하여 gccgo 생성 코드의 동작을 검사했습니다. Valgrind의 callgrind는 많은 비 C 코드도 실행할 수 있지만 불행히도 go1.0.2 생성 바이너리에 위배되는 가정을하고 있습니다. https://code.google.com/p/go/issues/detail?id=782 –

0

go build도 기본적으로 정적 링크이므로 사과와 사과를 비교하는 경우 gccgo에 -static 또는 -static-libgo 옵션을 제공해야합니다.

관련 문제