gpt4 book ai didi

go - 如何在不使用 cgo 的情况下将 Go 函数绑定(bind)到 C 调用?

转载 作者:IT王子 更新时间:2023-10-29 00:48:16 25 4
gpt4 key购买 nike

在我正在进行的项目中,我需要使用来自 Go 的一堆 C 函数。当前的实现是使用 cgo 来实现这一点,但这样做会产生巨大的性能影响,我正试图将其消除。

  • cgo 将所有 C 代码标记为系统调用,使调度程序在需要时分配新线程。由于我项目中大约 80% 的 CPU 时间花在了繁重的 C 工作上,这很快导致有很多线程(500+ 而不是 GOMAXPROCS (= 8)),我的 Linux内核不太喜欢。
  • 采用通常的“限制器”方法(使用缓冲 channel 锁定 cgo 调用)会导致大量互斥锁,从而降低程序速度。

我想在这个项目中继续使用 Go,因为它是管理并发性的好方法。

我尝试过的事情:

  • src/runtime/cgocall.go 中注释掉一些类似 entersyscall() 的东西(似乎没有太大帮助,我宁愿避免修改Go 代码)。
  • 将我的代码放在一个 .c 文件中并从 Go 中调用它,无需 import "C"。运气不好 - 我无法调用该函数,当我将函数名称写为 package·function 时,编译器提示文件中的字符无效。
  • 使用 .s 文件并将其编写为程序集。我的 asm 不是很好,我想不出来。

所以,我的问题是:如何在避免 cgo 开销的同时使用 Go 中的 C 函数?

旁注:我知道为什么 cgo 将所有调用都标记为系统调用,但在这种特定情况下,我调用的函数不会阻塞锁或 IO。

最佳答案

你想做的事是不可能的。 C 代码具有高开销是有原因的,这是因为 C 代码使用不同的 ABI(平台的 native ABI),它不支持 Go 使用的短堆栈。因此,无论何时 Go 代码调用 C 代码,都必须在线程 native 堆栈上继续执行。这会导致您看到的开销。没有办法消除这种开销。想一想:如果不需要开销,它就不会存在。

如果不知道您的程序是什么样子,就很难说您应该做什么。

关于go - 如何在不使用 cgo 的情况下将 Go 函数绑定(bind)到 C 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28127909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com