其实,这个问题并不复杂:每个新 rustc 版本都是由前一个版本的 rustc 编译出来的。也就是说,rustc 1.80.0 版本是用 rustc 1.79.0 版本编译的,rustc 1.79.0 版本又是由 rustc 1.78.0 版本编译的……以此类推,一直可以追溯到 rustc 0.7 版本。而那时,编译器是用 OCaml 写的,因此只需要一个 OCaml 编译...
在增量 lex 的基准上,我们修改了大量源码,Clang 比 rustc 速度快,但在其他增量基准上,rustc 又会反超 Clang。 macOS:C++ 构建速度通常快于 Rust。(数据越小越好) 但我的 macOS 机器上情况却截然不同。C++ 的构建速度常常快上 Rust 许多。在增量测试 utf-8 的基准,我们修改中等数量测试文件,rustc 编译速度...
2023 年 1 月 7 日更新:rustc 的 Cranelift 后端维护者 bjorn3 帮我看了下为什么 Cranelift 在我的项目上效果不佳:可能是 rustup 的开销导致的。如果绕过这部分 Cranelife 效果可能会有提升,上图中的结果没有采用任何措施。 编译器和链接器标志 编译器里有一堆可以加快(或减缓)构建速度的选项,让我们一一试...
2023 年 1 月 7 日更新:rustc 的 Cranelift 后端维护者 bjorn3 帮我看了下为什么 Cranelift 在我的项目上效果不佳:可能是 rustup 的开销导致的。如果绕过这部分 Cranelife 效果可能会有提升,上图中的结果没有采用任何措施。 编译器和链接器标志 编译器里有一堆可以加快(或减缓)构建速度的选项,让我们一一试...
C的 API 可惜这部分代码里不涉及并发或 I/O,我测试不了 Rust 里 async/await 的编译时间开销,但这只是 quick-lint-js 项目里的一小部分,所以我还不用太担心。 我首先把所有的 C++ 代码都复制到新项目里,然后删掉已知与词法分析无关的部分,比如分析器和 LSP 服务器。我甚至一不小心删多了代码,最后不得不...
在C 代码中调用 Rust 代码,需要我们将 Rust 源代码打包为静态库文件。在 C 代码编译时,链接进去。 1、创建静态库 1.1、在命令行使用cargo init --lib mylog建立 lib 库。添加以下代码到 src/lib.rs 中: 1#![crate_type = "staticlib"]23extern crate libc;45use libc::{c_int, c_char};6use std...
首先我们创建一个test.c文件然后输入以下内容 int mult() { int a = 5; int b = 3; int c = a * b; return c; } 1 2 3 4 5 6 将C源码转为LLVM IR 输入一下命令 clang -emit-llvm -S test.c -o test.ll 1 其中我们使用了clang作为前端进行编译,-emit-llvm用于LLVM IR写到.ll文件,-S...
我们来尝试一下以下手段,以优化 Rust 项目的编译时间: 更快的连接器 Cranelift 后端 编译器和连接器的标志 不同的工 作区和测试布局 尽可能减少依赖特性 c argo-nextest 通过PGO 定制的工具链 更快的连接器 第一步是对构建进行性能测试。首先通过 -Zself-profile 标志进行测试。在我的项目中,该标志会输出两个...
在Rust源代码中,rust/compiler/rustc_builtin_macros/src/format_foreign.rs这个文件的作用是处理外部格式化宏的实现。这些宏是Rust语言用来格式化输出的宏,它们在编译时被翻译成具体的代码实现。 在该文件中,有三个重要的struct:Format<'a>、Substitutions<'a>和StrCursor<'a>。这些struct用于处理格式化字符串中的...
编译器和连接器选项 编译器有许多开关,可以加速编译(或减缓编译)。我们来尝试一部分: -Zshare-generics=y (rustc) (实验性质的选项) -Clink-args=-Wl,-s (rustc) debug = false (Cargo) debug-assertions = false (Cargo) incremental = true and incremental = false (Cargo) ...