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

为何小规模场景下Go代码运行速度优于C代码?

小数据量下Go数组删除操作比C更快的性能观察

据我观察,以下两段程序逻辑完全一致,但在数组规模小于30000的场景下,Go版本的运行速度明显更快。

测试数据

Time taken for size 1000 in Go: 35.417µs
Time taken for size 1000 in C:  74.000000us

环境信息

  • 架构:Darwin, arm64

C代码编译命令

clang -O2 -march=native -mtune=native -g main.c

Go代码实现

package main

import (
   "fmt"
   "math/rand"
   "time"
)

func ArraySplice(array []int, index int) []int {
   return append(array[:index], array[index+1:]...)
}

func main() {
   s := 1000;
   array := make([]int, s)

   for i := 0; i < s; i++ {
      array[i] = rand.Intn(s)
   }

   start := time.Now()
   for len(array) > 0 {
      array = ArraySplice(array, array[len(array)/2] % len(array))
   }
   end := time.Now()
   fmt.Printf("Time taken for size %d: %v\n", s, end.Sub(start))
}

C代码实现

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

static inline size_t Array_Splice(int* array, size_t size, size_t index) {
   if (index >= size)
      return size;
   for (size_t i = index; i < size - 1; i++) {
      array[i] = array[i + 1];
   }
   return size - 1;
}

int main(void)
{
   const size_t size = 1000;
   size_t array_size = size;
   int* array = malloc(array_size * sizeof(int));
   if (array == NULL) {
      return 1;
   }

   for (size_t i = 0; i < size; i++) {
      array[i] = rand() % size;
   }

   const clock_t start = clock();
   while (array_size > 0) {
      array_size = Array_Splice(array, array_size, array[array_size/2] % array_size);
   }
   const clock_t end = clock();
   const double time_taken = (double)(end - start) / (CLOCKS_PER_SEC / 1000000.0f);
   printf("Time taken for size %lu: %fus\n", size, time_taken);

   free(array);
   return 0;
}

补充说明

  • 尝试过反汇编两段代码,但Go的汇编代码难以阅读。
  • 计时方式不存在问题,运行时间随数组规模线性增长。
  • 数组规模较大时C代码会显著领先,推测是Go的GC调用增加所致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:45:29