我试图找出Go的循环性能是否与C一样好,但是令人惊讶的是,对于我的简单测试,C版本花费两倍于Go版本的时间。为什么Go中的这个简单循环比C中的更快?
C版:
#include <stdio.h>
int main() {
int i = 0, a = 0;
while (i < 1e9) {
a = (a + i) % 42;
i = i + 1;
}
printf("%d\n", a);
}
,
$ gcc -o main main.c && time ./main # tried -O0 as well; the result is similar
36
./main 10.53s user 0.08s system 98% cpu 10.769 total
转到版本:
package main
import "fmt"
func main() {
a := int32(0)
for i := int32(0); i < 1e9; i++ {
a = (a + i) % 42
}
fmt.Println(a)
}
,
$ time go run main.go
36
colorgo run main.go 5.27s user 0.14s system 93% cpu 5.816 total
(在达尔文测试,amd64)
对于这个简单的算法,不应该他们都产生几乎相同的机器码?这是由于编译器优化?缓存效率?
请帮我理解!谢谢!
你的C程序编译时没有任何优化。 Go编译器可能会有一个不同的默认值,并且不经过指示即可进行优化。用'gcc -O2'编译一个更公平的比较。 – delnan 2014-10-01 21:51:07
@delnan For go:“由[Go]编译器生成的代码默认为'优化':”source:http://plan9.bell-labs.com/sys/doc/comp.pdf通过http:// golang.org/cmd/gc/ – dyp 2014-10-01 21:54:12
你可以得到asm来进行比较(对于Go就像'go build -gcflags -S')。我很困难,但你的Go使用的是32位整数,而C可能使用64,而64位除法是一个非常慢的指令。那或者Go在这里有一些不在gcc的默认优化级别上的优化。 – twotwotwo 2014-10-01 21:55:07