作家
登录

如何把Go调用C的性能提升10倍?

作者: 来源: 2017-09-08 10:04:35 阅读 我要评论

今朝,当Go须要和C/C++代码集成的时刻,大年夜家最先想到的肯定是CGO。毕竟是官方的解决筹划,并且简单。

调用C函数的时刻,必须切换当前的┞坊为线程的主栈,这带来了两个比较严重的问题:

  1. 线程的┞坊在Go运行时是比较少的,受到P/M数量的限制,一般可以简单的懂得成受到GOMAXPROCS限制;
  2. 因为须要同时保存C/C++的运行时,CGO须要在两个运行时和两个ABI(抽象二进制接口)之间做翻译和调和。这就带来了很大年夜的开销。

minio项目标一个副产品是 c2goasm 项目,这个项目也被 go-cv-simd 项目应用获得了很好的效不雅。

c2goasm 的角色是一个 汇编说话转换器,输入是 clang输出的amd64汇编,输出是go汇编。而clang的输入是C/C++说话。限制是不克不及有RTTI和异常。也就是说不克不及有C/C++运行时供给的高等功能。

c2goasm输出的go汇编,交给go的对象链可以直接生成go的可履行代码。

若何把Go调用C的机能晋升10倍?

c2goasm和CGO比,最大年夜的改进就是:

  1. 不再有C/C++运行时,也就没了在两者之间一向转换的逻辑开销;
  2. 不须要切换到线程的主栈来履行函数,因为c2goasm生成的是纯粹的go函数,不须要线程的主栈就可以履行;

由此就极大年夜的改进了机能,价值是兼容性和可移植性损掉了。

【编辑推荐】

  1. Python加强的生成器:协程
  2. 早年端小白到技巧专家,这里有3点可履行的建议
  3. Facebook开源VoiceLoop,根据开放场景语音文字合成新语音
  4. 法度榜样员经常说的「设计模式」到底是什么?
  5. 扒一扒C# 8.0新功能,法度榜样员会买单吗?
【义务编辑:未丽燕 TEL:(010)68476606】

然则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

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)