文档章节

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

LinkerLin
 LinkerLin
发布于 2017/09/06 14:48
字数 564
阅读 5108
收藏 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
博文 63
码字总数 14161
作品 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++都没有运行时。
zlog 1.0.6 发布,纯C日志函数库

再次感谢[nikuailema at gmail.com],找到了zlog的另一个瓶颈。 在我的开发环境下 可以看到速度提升了1倍不到点。 那么,在他的程序上,使用zlog 1.0.6 版本的提升速度是多少呢? 7倍! 那么...

难易
2012/06/15
461
3
MongoDB 3.0性能提升内幕:WiredTiger

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

it168网站
2015/04/18
0
0
利用 psyco 让 Python 程序执行更快

Python 和其他的脚本语言在性能上跟一些编译语言(如C语言)比较要差不少,例如这里有两个用 C 和 Python 语言编写的斐波纳契数列计算程序: C语言: Python语言: 下面是执行的时间比较: ...

红薯
2013/01/08
15.5K
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
8.7K
4

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7 下安装 Nginx

1、添加Nginx存储库 要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令 yum install epel-release 2、安装Nginx 现在Nginx存储库已经安装在您的服务器上,使用以下yum命令安装Nginx yum i...

Oo若离oO
19分钟前
0
0
漏洞防御与修复工作

漏洞管理工作是企业安全建设必不可少的一环,在风险管理工作中,漏洞管理能够防患于未然,企业对漏洞管理有着广泛的基础建设和实践经验。但随着攻防技术的发展,传统漏洞管理的安全技术和管理...

linuxprobe16
今天
1
0
MicroPython技术及应用前景

1 Micropython技术是什么? MicroPython极精简高效的实现了Python3语言。它包含Python标准库的一小部分,能在单片机和受限环境中运行。 1.1 MicroPython发展 由剑桥大学的理论物理学家乔治....

bodasisiter
今天
7
0
跟我学Spring Cloud(Finchley版)-13-通用方式使用Hystrix

本节详细讲解使用Hystrix的通用方式。 简介 Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix主要...

周立_ITMuch
今天
2
0
🛠️Hanjst/汉吉斯特更新加JavaScript运行时优化等

这是 Hanjst/汉吉斯特 发布以来的首个主要升级更新版本。这次的主要升级更新的内容包括移除HTML Comments注释行, 优化在 Hanjst include模板文件时的JavaScript运行时环境。 Hanjst 在设计和...

wadelau
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部