You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何数组访问微基准测试中Go性能较GCC慢4倍?

Go与C数组访问微基准测试性能差异疑问

为了更好地了解Go的性能特性、合理选择使用场景,我编写了这个数组访问微基准测试。从性能开销角度看,这个场景对Go来说本应是理想情况:循环内无内存分配/释放操作,数组访问明确处于边界范围内(理论上可移除边界检查)。但在AMD64架构下,和gcc -O3编译的C版本相比,Go的运行速度慢了整整4倍(通过Shell计时,每个测试耗时数秒,启动开销可忽略不计),这是为什么?

Go版本代码

package main

import "fmt"

func main() {
    fmt.Println("started");

    var n int32 = 1024 * 32

    a := make([]int32, n, n)
    b := make([]int32, n, n)

    var it, i, j int32

    for i = 0; i < n; i++ {
        a[i] =  i
        b[i] = -i
    }

    var r int32 = 10
    var sum int32 = 0

    for it = 0; it < r; it++ {
        for i = 0; i < n; i++ {
            for j = 0; j < n; j++ {
                sum += (a[i] + b[j]) * (it + 1)
            }
        }
    }
    fmt.Printf("n = %d, r = %d, sum = %d\n", n, r, sum)
}

C版本代码

#include <stdio.h>
#include <stdlib.h>


int main() {
    printf("started\n");

    int32_t n = 1024 * 32;

    int32_t* a = malloc(sizeof(int32_t) * n);
    int32_t* b = malloc(sizeof(int32_t) * n);

    for(int32_t i = 0; i < n; ++i) {
        a[i] =  i;
        b[i] = -i;
    }

    int32_t r = 10;
    int32_t sum = 0;

    for(int32_t it = 0; it < r; ++it) {
        for(int32_t i = 0; i < n; ++i) {
            for(int32_t j = 0; j < n; ++j) {
                sum += (a[i] + b[j]) * (it + 1);
            }
        }
    }
    printf("n = %d, r = %d, sum = %d\n", n, r, sum);

    free(a);
    free(b);
}

更新测试结果

  • 使用range遍历可使Go运行速度提升2倍
  • 测试发现,-march=native参数可使C版本运行速度提升2倍(-mno-sse与-O3不兼容,编译报错)
  • GCCGO的性能与GCC相当(无需使用range)

内容的提问来源于stack exchange,提问作者MWB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 13:33:34