最近Go1.1正式发布, 根据官方的说法, Go1.1性能比Go1.0提升基本有30%-40%, 有时更多(当然也有不明显的情况).
这里是针对Go1.1和C语言的性能测试: 测试的重点是语言的性能, 当然也会受到标准库性能的影响.
测试环境
硬件配置: Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz; 16GB内存
操作系统: CentOS6.3 x86_64
补充: i7-3770是4核心8线程.
gcc和gc版本:
gcc -v
gcc version4.4.720120313(Red Hat4.4.7-3) (GCC)
go version
go version go1.1linux/amd64
测试结果
$GOROOT/test/bench/shootout/timing.sh
fasta -n25000000
gcc -m64 -O2 fasta.c0.86u0.00s0.87r
gc fasta0.85u0.00s0.86r
gc_B fasta0.83u0.00s0.83r
reverse-complement
gcc -m64 -O2 reverse-complement.c0.45u0.05s0.50r
gc reverse-complement0.60u0.05s0.65r
gc_B reverse-complement0.55u0.04s0.59r
nbody -n50000000
gcc -m64 -O2 nbody.c -lm5.51u0.00s5.52r
gc nbody7.16u0.00s7.18r
gc_B nbody7.12u0.00s7.14r
binary-tree15# too slow to use20
gcc -m64 -O2 binary-tree.c -lm0.31u0.00s0.31r
gc binary-tree1.08u0.00s1.07r
gc binary-tree-freelist0.15u0.00s0.15r
fannkuch12
gcc -m64 -O2 fannkuch.c26.45u0.00s26.54r
gc fannkuch35.99u0.00s36.08r
gc fannkuch-parallel73.40u0.00s18.58r
gc_B fannkuch25.18u0.00s25.25r
regex-dna100000
gcc -m64 -O2 regex-dna.c -lpcre0.25u0.00s0.26r
gc regex-dna1.65u0.00s1.66r
gc regex-dna-parallel1.72u0.01s0.67r
gc_B regex-dna1.64u0.00s1.65r
spectral-norm5500
gcc -m64 -O2 spectral-norm.c -lm9.63u0.00s9.66r
gc spectral-norm9.63u0.00s9.66r
gc_B spectral-norm9.63u0.00s9.66r
k-nucleotide1000000
gcc -O2 k-nucleotide.c -I/usr/include/glib-2.0-I/usr/lib64/glib-2.0/include -lglib-2.02.62u0.00s2.63r
gc k-nucleotide2.69u0.01s2.71r
gc k-nucleotide-parallel3.02u0.00s0.97r
gc_B k-nucleotide2.66u0.01s2.68r
mandelbrot16000
gcc -m64 -O2 mandelbrot.c20.95u0.00s21.01r
gc mandelbrot23.73u0.00s23.79r
gc_B mandelbrot23.72u0.00s23.79r
meteor2098
gcc -m64 -O2 meteor-contest.c0.05u0.00s0.05r
gc meteor-contest0.06u0.00s0.07r
gc_B meteor-contest0.06u0.00s0.06r
pidigits10000
gcc -m64 -O2 pidigits.c -lgmp0.77u0.00s0.77r
gc pidigits1.45u0.01s1.44r
gc_B pidigits1.45u0.01s1.43r
threadring50000000
gcc -m64 -O2 threadring.c -lpthread12.05u261.20s216.36r
gc threadring6.61u0.00s6.63r
chameneos6000000
gcc -m64 -O2 chameneosredux.c -lpthread4.04u21.08s4.20r
gc chameneosredux4.97u0.00s4.99r
测试结果说明
其中gc_B是开了-B选项, 选项的说明如下:
go tool 6g -h
usage: 6g [options] file.go...
-+ compiling runtime
-% debug non-staticinitializers
-Aforbootstrapping, allow'any'type
-B disable bounds checking
...
应该就是禁用了Go的slice下标越界检测等特性.
测试的结果显示Go的性能已经和C语言已经非常接近了, 有极个别的甚至比C还好(binary-tree).
根据$GOROOT/test/bench/shootout/timing.log的数据, gccgo 的优化应该更好一点.
不过gccgo的标准库比gc性能可能要差一些(因此有些测试性能比gc差一些).
我电脑没有安装gccgo, 因此只有gcc/gc/gc_B三个测试结果.
关于 BenchmarksGame 的测试差异
BenchmarksGame的测试结果中, 有几个Go的性能很差:
Benchmark Time Memory Code
fasta3×3× ±
spectral-norm4×3× ±
binary-trees13×4× ±
regex-dna †26× ±1/4
其中 spectral-norm 和 binary-trees 的 C 版本都开了 #pragma omp 优化(这已经不是C语言级别的比较了).
而 Go 的 binary-trees 启动了很多 goroutine, Go并发的版本和C的非并发版本比较肯定也是不合理的.
其中regex的测试主要是Go的regex标准库和C的高度优化的pcre比较. 目前Go的regex库还有待进一步的优化.
官方的测试结论
# Sep26,2012
#64-bit ints, plus significantly better floating-point code.
# Interesting details:
# Generally something in the0-10% slower range, some (binary tree) more
# Floating-point noticeably faster:
# nbody -25%
# mandelbrot -37% relative to Go1.
# Other:
# regex-dna +47%
Go已经和C差距在10%以内, 有特殊场景性能甚至更好.
【编辑推荐】
【责任编辑:小林 TEL:(010)68476606】
点赞 0