今朝,当Go须要和C/C++代码集成的时刻,大年夜家最先想到的肯定是CGO。毕竟是官方的解决筹划,并且简单。
调用C函数的时刻,必须切换当前的┞坊为线程的主栈,这带来了两个比较严重的问题:
- 线程的┞坊在Go运行时是比较少的,受到P/M数量的限制,一般可以简单的懂得成受到GOMAXPROCS限制;
- 因为须要同时保存C/C++的运行时,CGO须要在两个运行时和两个ABI(抽象二进制接口)之间做翻译和调和。这就带来了很大年夜的开销。
minio项目标一个副产品是 c2goasm 项目,这个项目也被 go-cv-simd 项目应用获得了很好的效不雅。
c2goasm 的角色是一个 汇编说话转换器,输入是 clang输出的amd64汇编,输出是go汇编。而clang的输入是C/C++说话。限制是不克不及有RTTI和异常。也就是说不克不及有C/C++运行时供给的高等功能。
c2goasm输出的go汇编,交给go的对象链可以直接生成go的可履行代码。

c2goasm和CGO比,最大年夜的改进就是:
- 不再有C/C++运行时,也就没了在两者之间一向转换的逻辑开销;
- 不须要切换到线程的主栈来履行函数,因为c2goasm生成的是纯粹的go函数,不须要线程的主栈就可以履行;
由此就极大年夜的改进了机能,价值是兼容性和可移植性损掉了。
【编辑推荐】
- Python加强的生成器:协程
- 早年端小白到技巧专家,这里有3点可履行的建议
- Facebook开源VoiceLoop,根据开放场景语音文字合成新语音
- 法度榜样员经常说的「设计模式」到底是什么?
- 扒一扒C# 8.0新功能,法度榜样员会买单吗?
然则CGO是异常慢的。因为CGO其实一个桥接器,经由过程主动生成代码,CGO在保存了C/C++运行时的情况下,搭建了一个桥来沟通C/C++世界和Go的世界。这就意味着,兼容性很好,然则对C的函数的调用,必须先把当前的goroutine挂起,并切换履行栈到当前的线程M的主栈(大年夜小2MB)。如不雅不做这个操作,那么只能在goroutine的┞坊上履行C函数调用,可是,goroutine的┞坊一般都很小,很轻易就导致了栈溢出了。
推荐阅读
媒介不惹人留意的黑客设备平日,应用黑客技巧做些恶作剧的工作往往是很有趣的,如不雅你刚在一家收集安然公司找到了一份新的工作,并且该收集安然公司的收集存在一些安然马脚,那么出于好>>>详细阅读
本文标题:如何把Go调用C的性能提升10倍?
地址:http://www.17bianji.com/lsqh/37243.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示