一次C和Go的语言性能测试

2,501 阅读2分钟

测试方式

比较c和go如何处理斐波那契数列

测试环境

  • CPU信息:
CPU  (英特尔)Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
CPU核心数  12
CPU默认频率  2201 MHz
CPU外频  100 MHz
CPU当前频率  2200 MHz
二级缓存  1536 KB
三级缓存  9216 KB
  • 工具
c编译工具:gcc version 8.1.0 (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project)
go版本:go version go1.13.6 windows/amd64

测试对比

c 语言

  • 源码
// fib.c
#include <stdint.h>
#include <stdio.h>
#include <time.h>

static uint64_t fib(uint64_t n)
{
    if (n <= 1)
        return 1;
    return fib(n - 1) + fib(n - 2);
}

int main(void)
{
    time_t start, end;
    double cost;
    time(&start);
    printf("%llu \n", fib(46));
    time(&end);
    cost = difftime(end, start);
    printf("%fs", cost);

    return 0;
}
  • 结果
$ gcc -o fibc fib.c
$ ./fibc.exe
2971215073
9.000000s

$ ./fibc.exe
2971215073
9.000000s

$ ./fibc.exe
2971215073
9.000000s

go 语言

  • 源码
// fib.go
package main

import (
	"fmt"
	"time"
)

func fib(n uint64) uint64 {
	if n <= 1 {
		return 1
	}
	return fib(n-1) + fib(n-2)
}

func main() {
	start := time.Now()
	fmt.Printf("%v\n", fib(46))
	fmt.Println(time.Now().Sub(start))
}
  • 结果
$ go run "f:\Code\fib-test\fib.go"
2971215073
9.648023s

$ go run "f:\Code\fib-test\fib.go"
2971215073
9.6969298s

$ go run "f:\Code\fib-test\fib.go"
2971215073
9.6968697s

结语

对比分析,可知,处理同样的逻辑,确实c更快。不过,以上只是提供的一组测试数据。实际上,在测试的过程中还出现过go用时更少的情况(怕打脸,就不贴出来了😓),原因暂时不明。受当前系统的运行环境的影响,每次测出的值是不同的。更好的处理方式是用docker写个专门的测试镜像,推荐下Recursive Fibonacci Benchmark using top languages on Github。然而,从他的数据上来看,我测出的C可没这么快,go也没那么慢。希望有懂此道的看见后能给予解惑,不甚感激。