This article also has an English version.
一年前我写了一个叫 Rust2Go 的开源项目(相关 blog:Rust-Golang FFI 框架设计与实现),提供 Rust 到 Go 的高性能异步和同步调用支持。这个项目是多个社区项目,也是公司内部多个的项目的重要基础,我也在持续地优化其性能并开发新的功能。
我将在 Rust Asia Conf 2025 上分享相关内容,欢迎有兴趣的朋友参与!
最近我做了一些 CGO 相关的探索,并基于新开发的高性能 CGO 为 Rust2Go 支持了 Go 到 Rust 的主动调用,本文主要介绍前者。
注:本文非 Rust 限定内容,所有 Go 跨语言项目都可以使用或参考。本文也提供了对应的仓库和例子,欢迎有需要的用户接入使用。
本文将按以下顺序展开:
- 介绍 CGO 调用的原理和性能问题,也是本文的优化目标;
- 介绍如何通过最简单的汇编优化 CGO 调用;
- 指出栈空间问题,并介绍如何通过切换 G0 栈解决该问题;
- 介绍 Async Preemption,以及如何阻止它以保证 G0 栈不被污染;
- 优化效果和应用场景。