- 主题:Cgo效率真低
【 在 gpmn 的大作中提到: 】
: 用了cgo就不能跨平台,能不用就不用吧
为什么不行,曾经在x86+arm上用的挺好的
--
FROM 116.25.147.*
背后的原因好像跟协程什么的有关是吧。。需要把调用放到一个单独的线程里面去处理?
【 在 harmonica (草原上琴声忧伤) 的大作中提到: 】
: 有个应用用到C写的lib库,用Cgo调了下,高频次的调用性能惨不忍睹,大部分耗在Cgo调用了。看了下原理go调用C是比较特殊;有个方案是把C编译成汇编再转成Go的汇编,再直接编到go的二进制里去。可对于一个很大的lib,这个方法看上去就很麻烦了。有没有更好的方案?
--
FROM 112.47.122.*
你的高频是多高的频率?一秒万次可能不太好弄你得多研究研究c和go的协作,否则做成进程间调用就足够了,一秒十多次的话简单的用GRPC远程调用就行,一秒成百上千次就自己设计共享内存做进程间交互了。
--
FROM 101.88.18.*
主要是没法inline吧,每次要通过栈
【 在 harmonica 的大作中提到: 】
:
: 有个应用用到C写的lib库,用Cgo调了下,高频次的调用性能惨不忍睹,大部分耗在Cgo调用了。看了下原理go调用C是比较特殊;有个方案是把C编译成汇编再转成Go的汇编,再直接编到go的二进制里去。可对于一个很大的lib,这个方法看上去就很麻烦了。有没有更好的方案?
:
: --
: ..................
发自「今日水木 on iPhone 11 Pro Max」
--
FROM 13.94.42.*
把c的lib封装成dll或者so,然后用syscall or dlopen来调用接口呢?
--
FROM 218.69.191.*
写段Go汇编, 汇编原型声明足够大的栈空间,比如1M, 然后用汇编将栈寄存器收小, 将空岀的空间给C用, 否则可能没C需要的足够栈空间, 然后通过汇编按C的传参规则调用C
【 在 harmonica 的大作中提到: 】
:
: 有个应用用到C写的lib库,用Cgo调了下,高频次的调用性能惨不忍睹,大部分耗在Cgo调用了。看了下原理go调用C是比较特殊;有个方案是把C编译成汇编再转成Go的汇编,再直接编到go的二进制里去。可对于一个很大的lib,这个方法看上去就很麻烦了。有没有更好的方案?
:
: --
: 发自xsmth (iOS版)
: --
:
发自「今日水木 on RVL-AL09」
--
FROM 223.104.3.*
将cgo线程常驻内存
通过内存和go通信
因为c和go的堆栈不同
需要栈拷贝
频繁创建销毁线程导致性能下降
把go的对象丢到内存队列交给cgo
cgo处理完再丢回内存通道,go取走结果
性能即可提升
【 在 harmonica 的大作中提到: 】
: 有个应用用到C写的lib库,用Cgo调了下,高频次的调用性能惨不忍睹,大部分耗在Cgo调用了。看了下原理go调用C是比较特殊;有个方案是把C编译成汇编再转成Go的汇编,再直接编到go的二进制里去。可对于一个很大的lib,这个方法看上去就很麻烦了。有没有更好的方案?
:
--
FROM 114.241.236.*
开销的确大
同样功能,和用纯 go 写差了一截子
我们还有功能需要 C 调用 go
也是性能一塌糊涂
好在调用频次没那么高,就没管了
【 在 try 的大作中提到: 】
: 具体的场景是什么样的能描述一下吗?
: overhead 主要在哪里?
: 我之前用 cgo 的时候没觉得有特别高的 overhead。
: ...................
--
FROM 125.70.25.*