文档章节

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

LinkerLin
 LinkerLin
发布于 2017/09/06 14:48
字数 564
阅读 1.5W
收藏 79

行业解决方案、产品招募中!想赚钱就来传!>>>

目前,当Go需要和C/C++代码集成的时候,大家最先想到的肯定是CGO。毕竟是官方的解决方案,而且简单。

但是CGO是非常慢的。因为CGO其实一个桥接器,通过自动生成代码,CGO在保留了C/C++运行时的情况下,搭建了一个桥来沟通C/C++世界和Go的世界。这就意味着,兼容性很好,但是对C的函数的调用,必须先把当前的goroutine挂起,并切换执行栈到当前的线程M的主栈(大小2MB)。如果不做这个操作,那么只能在goroutine的栈上执行C函数调用,可是,goroutine的栈一般都很小,很容易就导致了栈溢出了。

调用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的可执行代码。

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

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

由此就极大的改进了性能,代价是兼容性和可移植性损失了。

LinkerLin

LinkerLin

粉丝 76
博文 63
码字总数 14161
作品 1
长宁
程序员
私信 提问
加载中
此博客有 25 条评论,请先登录后再查看。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
5.9K
18
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
在多个浏览器上运行脚本--Queen

假设你想和朋友们玩这么个游戏:你写下某个数字,然后让朋友们猜你写的是什么数字。你的朋友们将不断的给你一些猜测的数字,直到猜中为止。 现在想象你的朋友都是使用的浏览器,这个游戏就相...

匿名
2013/01/24
4.5K
1
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云手动搭建k8s搭建中遇到的问题解决(持续更新)

阿里云手动搭建k8s搭建中遇到的问题解决(持续更新) 参考文章: (1)阿里云手动搭建k8s搭建中遇到的问题解决(持续更新) (2)https://www.cnblogs.com/charlieroro/p/8450102.html 备忘一...

osc_r94nrknb
4分钟前
0
0
在IntelliJ IDEA中多线程并发代码的调试方法

通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法。让你在多线程开发过程中的调试更加的有的放矢。 我们将通过一个例子来学习。在这里,我编...

fightinging
5分钟前
0
0
Oracle使用PLSQL导入数据后中文乱码的解决方法

Oracle使用PLSQL导入数据后中文乱码的解决方法 参考文章: (1)Oracle使用PLSQL导入数据后中文乱码的解决方法 (2)https://www.cnblogs.com/yzhyingcool/p/10431137.html 备忘一下。...

osc_4punxmqt
5分钟前
0
0
ATFX安全知识:亏损形成或因偏见,勿被认知所骗

在汇市中,有一些人尽管有多年的投资交易经验,却总是与盈利无缘。如果归咎于交易水平不够,明显是很勉强的。是心态不对吗?可能也不是。其根本就在于没有分清外汇交易的本质,其潜意识里将投...

osc_ufe2hk4l
5分钟前
0
0
编码的浪漫:完美序列化的官方评测

在北银河65000个共和星,Zipack就像一台以可控核聚变驱动的永续型发动机,动力强劲,没有一丝赘肉。 西伯利亚大橘猫 Zipack VS MessagePack 虽然以前使劲吹过MessagePack,认为它是JSON的完美...

失败人士
12分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部