Algorithm 使用cgo时;性能开销在何处/何时发生?

Algorithm 使用cgo时;性能开销在何处/何时发生?,algorithm,cgo,Algorithm,Cgo,我知道当使用cgo时,每次go->C函数调用都会受到性能影响。当尝试优化我的程序时,我想知道将在何处添加延迟,以便减少这些情况。所以在假设的任意值中(因为我没有实际的调用时间) 如果(开始假设) |呼叫类型|时间(任意单位) |--- |--- |go->go|1 |转到->C | 10 问题,答案: C->go=10 那么: go->C->C?=20或~11 go->C->C->go?=?(等于什么?) 本质上,doC->go,和C-C调用会招致与go->C相同的惩罚,如果是,当链接时,这种惩

我知道当使用
cgo
时,每次go->C函数调用都会受到性能影响。当尝试优化我的程序时,我想知道将在何处添加延迟,以便减少这些情况。所以在假设的任意值中(因为我没有实际的调用时间)

如果(开始假设)

|呼叫类型|时间(任意单位) |--- |--- |
go->go
|1
|转到->C | 10

问题,答案:
C->go
=
10
那么:

go->C->C
?=
20
或~
11

go->C->C->go
?=?(等于什么?)

本质上,do
C->go
,和
C-C
调用会招致与
go->C
相同的惩罚,如果是,当链接时,这种惩罚会成倍增加吗?
也就是说,
go->C->C->go
=(3*
go->C


我希望这不是一个太武断的问题,我希望其他人也有同样的需求,并进行了测试。谢谢

基准测试表明go->C的开销非常小。每次通话只需几纳秒。因此,如果这就是你所做的,那么你应该能够忽略开销


另一方面,C->go应该有相当大的开销。开始一个新的围棋项目。因此,如果可能,最好直接避免这种情况。只要重写你的应用程序,如果可能的话,让go->C来检查事情或得到响应,这样你就可以跳过C->go,而只是让go->go。

据我所知,只有在跨越C/go边界时才会产生性能损失。go->C->C将导致惩罚一次,而不是两次,而go->C->C->go将导致惩罚两次,而不是三次。我不确定如何用这些任意值解释这个问题——C和go之间存在上下文切换。C在C环境下运行,Go在Go环境下运行。谢谢各位,我很欣赏你们的见解。还有@JimB我对问题的原始格式感到抱歉-我写了一些,希望它更有意义。如果我有机会进行测试,我会在这里发帖,但我暂时认为答案仅仅是语言边界/上下文交叉带来的决定因素,而不是C语言中的任何东西,在第一次交叉中产生冲击。(因此,
go->C->go
=20,但go
go->C->C->go
是21,而不是30)如果我错了,请纠正我。@ehiller:
go->C->go
go->C->go
是同一回事。如果C代码没有做任何事情,那么就没有理由调用它,因此对C的任何调用都必须包含一些C->C调用。Go不能真正影响C代码的内部执行。基准测试表明Go->C的开销非常小。每次通话只需几纳秒。因此,如果这就是你所做的,那么你应该能够忽略开销。