作者:张富春(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 代码的更多相关文章

  1. 小C和小派的缠绵爱情——C语言调用Python代码

    我妒忌你的开源,你眼红我的速度,不如我们就在一起吧! --------SJ2050 2019.4.9号更新:实现在未安装python环境的机子上运行调用了python程序的C语言代码! 文章目录 环境 ...

  2. 如何在Java中调用Python代码

    有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...

  3. Rails 5 Test Prescriptions 最后一章,如何测试继承下来的代码,legacy code

    Set expectations 你不可能把一个老旧的代码野兽只用一晚就转变成优雅的奇迹marvel.你需要如下做法: 让自己有好的状态,用15分钟挥舞拳头诅咒之前的程序员 开始工作,这个codeba ...

  4. 11 jsp脚本调用java代码

    大多数情况下, jsp 文档的大部分由静态文本(html)构成, 为处理该页面而创建的 servlet 只是将它们原封不动的传递给客户端, 原封不动的传送给客户端有两个小例外: 1. 如果想传送 &l ...

  5. 在Java中调用Python代码

    极少数时候,我们会碰到类似这样的问题:与A同学合作写代码, A同学只会写Python,不熟悉Java ,而你只会写Java不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方 ...

  6. 小程序webview调用微信扫一扫的“曲折”思路

    自上一篇遇到webview中没有返回按钮之后,虽然跳出坑了.解决方案:<小程序webview跳转页面后没有返回按钮完美解决方案> 但是,小程序踩坑之路并没有结束.在公众号网页中通过配置AP ...

  7. C#调用Java代码

    c#直接调用java代码,需要ikvmbin-0.44.0.5.zip.下载地址: http://pan.baidu.com/share/link?shareid=3996679697&uk= ...

  8. android 编译调用C代码

    博客地址:www.zalezone.cn 前言 需求来源 这几天帮别人做一个简单的androidclient,也没什么功能,主要就是调用C代码来对手机的Wifi网络进行设置.于是也就引出了技术难点所在 ...

  9. Node.js调用C#代码

    在Node.js的项目中假如我们想去调用已经用C#写的dll库该怎么办呢?在这种情况下Edge.js是一个不错的选择,Edge.js是一款在GitHub上开源的技术,它允许Node.js和.NET c ...

  10. C++用LuaIntf调用Lua代码示例

    C++用LuaIntf调用Lua代码示例 (金庆的专栏 2016.12) void LuaTest::OnResponse(uint32_t uLuaRpcId, const std::string& ...

随机推荐

  1. 低至200元 / 月,火山引擎DataLeap帮你搭建企业级数据中台

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 企业数字化转型正席卷全球,这不仅是趋势所在,也是企业发展必然面对的考题.数字化不仅仅考验企业的技术"硬& ...

  2. Chrome 护眼模式 - 黑暗模式 - 夜眼(Night Eye) 插件

    Chrome 地址栏里输入: chrome://extensions/ 打开插件商城:

  3. Java 网络编程 —— 实现非阻塞式的客户端

    创建阻塞的 EchoClient 客户程序一般不需要同时建立与服务器的多个连接,因此用一个线程,按照阻塞模式运行就能满足需求 public class EchoClient { private Soc ...

  4. 在WPF应用中使用FastReport.WPF报表模块

    FastReport是一个非常不错的报表组件,在Winform应用中常常使用它进行报表的设计.预览展现.打印或者导出文件(PDF.Excel)等,可以设计打印各种各样的报表,本篇随笔继续介绍当前最新的 ...

  5. PS 项目报工与取消

    1.项目报工 1.1.CN25 1.2.BAPI:BAPI_NETWORK_CONF_ADD "-----------------------------@斌将军-------------- ...

  6. 图扑 HT for Web 风格属性手册教程

    图扑软件明星产品 HT for Web 是一套纯国产化独立自主研发的 2D 和 3D 图形界面可视化引擎.HT for Web(以下简称 HT)图元的样式由其 Style 属性控制,并且不同类型图元的 ...

  7. freeswitch查看所有通道变量

    概述 freeswitch 是一款好用的开源软交换平台. 实际应用中,我们经常需要对fs中的通道变量操作,包括设置和获取,set & get. 但是,fs中有众多的内部定义通道变量,也有外部传 ...

  8. java基础-集合-day14

    目录 1. 数据结构 算法 2. 本章的重点 集合 3. collections 4. list 5. 泛型 6. 泛型通配符 7. linkedList 8. 模拟linkedList源码 --面试 ...

  9. ApplicationContextAware 的理解和应用

    当我们在项目中获取某一个spring bean时,可以定义一个类,实现ApplicationContextAware  该接口,该接口可以加载获取到所有的 spring bean. package c ...

  10. VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...