【小测试】fastcgo 调用 c 代码
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
找到了一个项目 https://github.com/petermattis/fastcgo: 通过汇编的方式来 call c函数,相比 cgo 会快很多。
究竟多块,我做了个测试:
- 测试的 api: getpid()
- 直接 syscall 的版本:284.7333 ns / op
- cgo的版本:579.0323 ns / op
- fastcgo 版本:290.9751 ns / op
可见 fastcgo 只比直接 syscall 慢一点点,当需要频繁的系统调用的场合,可以用 fastcgo 来代替 cgo.
下面是测试代码:
package main
/*
#define _GNU_SOURCE
#include <sched.h>
// getpid()
*/
import "C"
import (
"fmt"
"log"
"os"
"runtime"
"strconv"
"strings"
"time"
"unsafe"
"github.com/petermattis/fastcgo"
)
func GetPidFast() int {
var ret C.int
fastcgo.UnsafeCall4(C.getpid, uint64(uintptr(unsafe.Pointer(&ret))), 0, 0, 0)
return int(ret)
}
const runTimes = 10000000
func getpidTest() {
now := time.Now()
for i := 0; i < runTimes; i++ {
_ = os.Getpid()
}
fmt.Println("os.Getpid(): ", time.Since(now).Microseconds())
}
func getpidCgoTest() {
now := time.Now()
for i := 0; i < runTimes; i++ {
_ = C.getpid()
}
fmt.Println("C.getpid(): ", time.Since(now).Microseconds())
}
func getpidFastCgoTest() {
now := time.Now()
for i := 0; i < runTimes; i++ {
_ = GetPidFast()
}
fmt.Println("GetPidFast(): ", time.Since(now).Microseconds())
}
func main() {
runtime.GOMAXPROCS(1)
getpidTest()
getpidFastCgoTest()
getpidCgoTest()
}
【小测试】fastcgo 调用 c 代码的更多相关文章
- 小C和小派的缠绵爱情——C语言调用Python代码
我妒忌你的开源,你眼红我的速度,不如我们就在一起吧! --------SJ2050 2019.4.9号更新:实现在未安装python环境的机子上运行调用了python程序的C语言代码! 文章目录 环境 ...
- 如何在Java中调用Python代码
有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...
- Rails 5 Test Prescriptions 最后一章,如何测试继承下来的代码,legacy code
Set expectations 你不可能把一个老旧的代码野兽只用一晚就转变成优雅的奇迹marvel.你需要如下做法: 让自己有好的状态,用15分钟挥舞拳头诅咒之前的程序员 开始工作,这个codeba ...
- 11 jsp脚本调用java代码
大多数情况下, jsp 文档的大部分由静态文本(html)构成, 为处理该页面而创建的 servlet 只是将它们原封不动的传递给客户端, 原封不动的传送给客户端有两个小例外: 1. 如果想传送 &l ...
- 在Java中调用Python代码
极少数时候,我们会碰到类似这样的问题:与A同学合作写代码, A同学只会写Python,不熟悉Java ,而你只会写Java不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方 ...
- 小程序webview调用微信扫一扫的“曲折”思路
自上一篇遇到webview中没有返回按钮之后,虽然跳出坑了.解决方案:<小程序webview跳转页面后没有返回按钮完美解决方案> 但是,小程序踩坑之路并没有结束.在公众号网页中通过配置AP ...
- C#调用Java代码
c#直接调用java代码,需要ikvmbin-0.44.0.5.zip.下载地址: http://pan.baidu.com/share/link?shareid=3996679697&uk= ...
- android 编译调用C代码
博客地址:www.zalezone.cn 前言 需求来源 这几天帮别人做一个简单的androidclient,也没什么功能,主要就是调用C代码来对手机的Wifi网络进行设置.于是也就引出了技术难点所在 ...
- Node.js调用C#代码
在Node.js的项目中假如我们想去调用已经用C#写的dll库该怎么办呢?在这种情况下Edge.js是一个不错的选择,Edge.js是一款在GitHub上开源的技术,它允许Node.js和.NET c ...
- C++用LuaIntf调用Lua代码示例
C++用LuaIntf调用Lua代码示例 (金庆的专栏 2016.12) void LuaTest::OnResponse(uint32_t uLuaRpcId, const std::string& ...
随机推荐
- 华为云企业级Redis:助力VMALL打造先进特征平台
摘要:当电商平台对AI算法模型的需求越来越多,特征数据平台的统一建设是不少开发团队头疼的事情.因为只有通过统一的特征数据存储,才能改变原有的"数据孤岛",解决生产重复造轮子的窘境. ...
- linux添加用户,修改用户密码,修改用户权限,设置root用户操作
1.添加普通用户 [root@server ~]# useradd chenjiafa //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa ...
- Snack3 3.1.10的新特性及应用
<dependency> <groupId>org.noear</groupId> <artifactId>snack3</artifactId& ...
- 负载均衡 SLB 健康检查异常
负载均衡 SLB 健康检查异常,接口地址不能访问 接口地址的访问首先需要健康检查状态为正常. 如果接口没有"首页",需要提供一个可访问的controller
- WEB端播放华为海康大华视频方案
WEB端播放华为海康大华视频方案 类似标题:谷歌浏览器播放华为海康大华视频方案 方案 以下方案相当于给需要播放视频的WEB系统做了一个专用的浏览器,通过专用浏览器的CS客户端组件播放视频,当然,这个专 ...
- 【QT 学习之路】事件
事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等:另一些事 ...
- 神经网络优化篇:详解Adam 优化算法(Adam optimization algorithm)
Adam 优化算法 在深度学习的历史上,包括许多知名研究者在内,提出了优化算法,并很好地解决了一些问题,但随后这些优化算法被指出并不能一般化,并不适用于多种神经网络,时间久了,深度学习圈子里的人开始多 ...
- vscode报错Already included file name ‘xxx‘ differs from file name ‘xxx‘ only in casing的解决方法:
场景:我们创建了一个文件是小写开头的,又改成大写开头的. 比如: relationDemo.vue 改成 RelationDemo.vue 原因:缓存的判重逻辑是不区分大小写导致的.在这种情况下,vs ...
- zzuli 1907: 小火山的宝藏收益
***题意:中文的 做法:邻接表+DFS,就相当于搜一棵树,比较一下当前结点得到的宝藏多还是子树下面得到的宝藏多,仔细想想就是水题*** #include<iostream> #inclu ...
- go Print 和 反射
0. 前言 在 小白学标准库之反射 reflect 篇中介绍了反射的三大法则.但并未给出具体示例介绍反射,感觉还是少了点什么.这里进一步通过fmt.Println 源码,查看反射如何使用的,算是对前文 ...
