【小测试】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& ...
随机推荐
- 湖仓一体天花板,大数据一站式SQL分析技术实践
摘要:本文将详细阐述HetuEngine在实现一站式SQL分析所面临的挑战.技术架构和案例. 本文分享自华为云社区<[华为云Stack][大架光临]第7期:湖仓一体天花板,大数据一站式SQL分析 ...
- ClickHouse 在 UBA 系统中的字典编码优化实践
ClickHouse UBA 版本是字节跳动内部在开源版本基础上为火山引擎增长分析专门深度定制优化的版本.本文介绍在字典编码方向上的优化实践,作者系字节跳动数据平台研发工程师 Jet He,长期致力于 ...
- 火山引擎 DataTester:如何用 A/B 测试做产品增长?
技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着如今越来越高的获客成本,用户拉新变得不再容易:而且由于获客成本的增高,让用户留存也变得更加重要.同时,一个产品的使 ...
- 火山引擎A/B测试:MAB智能调优实验,企业活动效果提升新利器
618临近,各大电商APP的预热活动已然拉开序幕.对企业而言,一场活动从策划到上线,中间经过效果验证,其业务成本很高.一个好的活动创意从策划.开发.到最终发布,至少会经历几周实践,如果中间还经历A ...
- Solon2 接口开发: 了解 LoadBalance
上一文的代码 HttpUtils.http(sevName, ctx.path()) (来自 "solon.cloud.httputils" 插件的工具类),内部是通过 sevNa ...
- Solon2 之基础:四、应用启动过程与完整生命周期
串行的处理过程(含六个事件扩展点 + 两个函数扩展点),代码直接.没有什么模式.易明 提醒: 启动过程完成后,项目才能正常运行(启动过程中,不能把线程卡死了) AppBeanLoadEndEvent ...
- Codeforces Round #704 (Div. 2) A~E
比赛链接:https://codeforces.com/contest/1492 1492A.Three swimmers 题意: 有三名游泳的人,他们分别需要 \(a,b,c\) 分钟才能在一个游泳 ...
- 面试官:SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制. 那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到 ...
- python之pycharm常见使用技巧
一.ctrl+d:复制
- maven总结三: 常用插件
本文为博主原创,转载请注明出处: 目录: 1. maven-release-plugin 2. maven-compiler-plugin 3. maven-assembly-plugin 4. sp ...
