文档章节

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

LinkerLin
 LinkerLin
发布于 2017/09/06 14:48
字数 564
阅读 4865
收藏 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

粉丝 71
博文 62
码字总数 13979
作品 1
长宁
程序员
加载中

评论(25)

LinkerLin
LinkerLin

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

我就喜欢看一本正经的胡说八道。c/c++都没有运行时。

回复@nullref : C/C++ 都有运行时的,C的运行时很简单但也不能忽略。说C++没有运行时那就是没看过Clang源码啦。
兄台说的可是运行时库?别强要面子了,兄台连运行时的概念都没有!
解释型,半静态语言才能称有运行时。例如C#/java/js/py/lua等

回复@nullref : C/C++当然有runtime了,你可以去看下clang的源码。

引用来自“nullref”的评论

我做这块工作六年了,有没有运行时,我很清楚。你拿一个library来说这语言有run time,是搞笑艺人么?
运行时 这个东西的概念,不等于脚本语言用的VM。
LinkerLin
LinkerLin

引用来自“nullref”的评论

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

我就喜欢看一本正经的胡说八道。c/c++都没有运行时。

回复@nullref : C/C++ 都有运行时的,C的运行时很简单但也不能忽略。说C++没有运行时那就是没看过Clang源码啦。
兄台说的可是运行时库?别强要面子了,兄台连运行时的概念都没有!
解释型,半静态语言才能称有运行时。例如C#/java/js/py/lua等

回复@nullref : C/C++当然有runtime了,你可以去看下clang的源码。
我做这块工作六年了,有没有运行时,我很清楚。你拿一个library来说这语言有run time,是搞笑艺人么?

回复@nullref : 你看下clang、gcc的源码啊。C有自己的crt C run time library.
nullref
nullref

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

我就喜欢看一本正经的胡说八道。c/c++都没有运行时。

回复@nullref : C/C++ 都有运行时的,C的运行时很简单但也不能忽略。说C++没有运行时那就是没看过Clang源码啦。
兄台说的可是运行时库?别强要面子了,兄台连运行时的概念都没有!
解释型,半静态语言才能称有运行时。例如C#/java/js/py/lua等

回复@nullref : C/C++当然有runtime了,你可以去看下clang的源码。
我做这块工作六年了,有没有运行时,我很清楚。你拿一个library来说这语言有run time,是搞笑艺人么?
LinkerLin
LinkerLin

引用来自“nullref”的评论

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

我就喜欢看一本正经的胡说八道。c/c++都没有运行时。

回复@nullref : C/C++ 都有运行时的,C的运行时很简单但也不能忽略。说C++没有运行时那就是没看过Clang源码啦。
兄台说的可是运行时库?别强要面子了,兄台连运行时的概念都没有!
解释型,半静态语言才能称有运行时。例如C#/java/js/py/lua等

ObjC/Swift/C/C++都有运行时的。
LinkerLin
LinkerLin

引用来自“nullref”的评论

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

我就喜欢看一本正经的胡说八道。c/c++都没有运行时。

回复@nullref : C/C++ 都有运行时的,C的运行时很简单但也不能忽略。说C++没有运行时那就是没看过Clang源码啦。
兄台说的可是运行时库?别强要面子了,兄台连运行时的概念都没有!
解释型,半静态语言才能称有运行时。例如C#/java/js/py/lua等

回复@nullref : http://blog.csdn.net/luoweifu/article/details/49049877
LinkerLin
LinkerLin

引用来自“nullref”的评论

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

我就喜欢看一本正经的胡说八道。c/c++都没有运行时。

回复@nullref : C/C++ 都有运行时的,C的运行时很简单但也不能忽略。说C++没有运行时那就是没看过Clang源码啦。
兄台说的可是运行时库?别强要面子了,兄台连运行时的概念都没有!
解释型,半静态语言才能称有运行时。例如C#/java/js/py/lua等

回复@nullref : C/C++当然有runtime了,你可以去看下clang的源码。
nullref
nullref

引用来自“LinkerLin”的评论

引用来自“nullref”的评论

我就喜欢看一本正经的胡说八道。c/c++都没有运行时。

回复@nullref : C/C++ 都有运行时的,C的运行时很简单但也不能忽略。说C++没有运行时那就是没看过Clang源码啦。
兄台说的可是运行时库?别强要面子了,兄台连运行时的概念都没有!
解释型,半静态语言才能称有运行时。例如C#/java/js/py/lua等
LinkerLin
LinkerLin

引用来自“nullref”的评论

我就喜欢看一本正经的胡说八道。c/c++都没有运行时。

回复@nullref : C/C++ 都有运行时的,C的运行时很简单但也不能忽略。说C++没有运行时那就是没看过Clang源码啦。
不会飞的猪
不会飞的猪
很厉害~ mark
nullref
nullref
我就喜欢看一本正经的胡说八道。c/c++都没有运行时。
MongoDB 3.0性能提升内幕:WiredTiger

  【IT168 评论】MongoDB出现是个意外,最初的想法是构建一个用于开发、托管并具有自动缩放Web应用程序的在线服务,而不是数据库。结果无心插柳柳成荫,却成就了全球最流行的NoSQL数据库,...

it168网站
2015/04/18
0
0
zlog 1.0.6 发布,纯C日志函数库

再次感谢[nikuailema at gmail.com],找到了zlog的另一个瓶颈。 在我的开发环境下 -------------------------------------------------v1.0.6$ time ./testpresszlog 1 10 100000real 0m1.81......

难易
2012/06/15
456
3
利用 psyco 让 Python 程序执行更快

Python 和其他的脚本语言在性能上跟一些编译语言(如C语言)比较要差不少,例如这里有两个用 C 和 Python 语言编写的斐波纳契数列计算程序: C语言: int fib(int n){if (n < 2) else } int...

红薯
2013/01/08
14.8K
48
微软称 Live Hotmail 速度提升了10倍

Hotmail的产品经理Dick Craddock今天在微软Windows团队博客上发表了一篇文章叙述了Hotmail是如何提升性能的,在上一次更新后,Hotmail的用户体验得到了极大的提升,特别是在速度上实测有10倍...

小编辑
2011/07/01
1K
11
Cython 三分钟入门

作者:perrygeo 译者:赖勇浩(http://laiyonghao.com) 原文:http://www.perrygeo.net/wordpress/?p=116 我最喜欢的是Python,它的代码优雅而实用,可惜纯粹从速度上来看它比大多数语言都要...

鉴客
2012/02/23
6.5K
4

没有更多内容

加载失败,请刷新页面

加载更多

数字转换为字符的L受哪个参数影响

我们知道,如果想把金额带上本位币,一般加上L, 比如: select to_char(salary,'L99,9999.00') from employees; 下面显示如下: SALARY TO_CHAR(SALARY,'L99, 2900 ¥2,900.00 2500 ¥2,500.00 ...

tututu_jiang
19分钟前
1
0
shell编程(告警系统主脚本、告警系统配置文件、告警系统监控项目)

告警系统主脚本 先定义监控系统的各个目录,然后再去定义主脚本,因为是分布式的,所以需要每台机器都这样做,如果事先有创建好各个目录和各个脚本,那么就可以把这些目录和脚本copy到其他机...

蛋黄_Yolks
20分钟前
1
0
SAP HANA Backup and Recovery

SAP HANA Backup and Recovery Skip to end of metadata Created by Paul Power, last modified on Nov 23, 2017 Go to start of metadata Purpose System Privileges How to Perform a Back......

rootliu
21分钟前
1
0
JVM的持久代——何去何从?

本文会介绍一些JVM内存结构的基本概念,然后很快会讲到持久代,来看下Java SE 8发布后它究竟到哪去了。 基础知识 JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令...

java知识分子
38分钟前
1
0
Hive和HBase的区别

hive是文件的视图,hbase是建了索引的key-value表。 先放结论:Hbase和Hive在大数据架构中处在不同位置,Hbase主要解决实时数据查询问题,Hive主要解决数据处理和计算问题,一般是配合使用。...

飓风2000
45分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部