我一直在开发一个为网站生成静态内容的 Rust 程序。在我的机器上,它的构建时间约为 600 毫秒(不是很好,但完全可以管理)。
我想添加一些动态内容,所以我正在尝试 Actix-Web,但它已将编译时间增加到大约 18-20 秒,这对我来说太长了。
我知道有两种方法可以解决这个问题:
将我的应用程序重写为 CGI 脚本。这消除了 Actix 依赖性,并且应该恢复我约 600 毫秒的编译时间。
将我的应用程序拆分为一个 Web 服务器和一个二进制文件,Web 服务器在访问路由时调用该二进制文件。这样,我只需在每次更改 API 时编译 Web 服务器,然后就可以通过
stdin
/stdout
与二进制文件进行交互。
这些似乎很难维护,所以我想知道 Rust 生态系统中是否还有其他选择。我还可以使用其他网络框架吗? IIRC Tide 和 Rocket 的编译速度都和 Actix 一样慢。有什么技巧可以用来加快 Actix 编译时间吗?还有其他我没有想到的选择吗?
注意:我一点也不关心运行时性能。这是一个只有少数人会使用的应用程序。
更新:这是我一直在使用的 Actix 示例:
use actix_session::Session;
use actix_session::{storage::CookieSessionStore, SessionMiddleware};
use actix_web::{get, Responder};
use actix_web::{App, HttpServer};
#[get("/session")]
async fn session(session: Session) -> impl Responder {
let counter = match session.get::<i32>("counter") {
Ok(counter) => match counter {
Some(counter) => counter + 1,
_ => 1,
},
_ => 1,
};
match session.insert("counter", counter) {
_ => format!("You have visited {} times", counter),
}
}
static SESSION_SIGNING_KEY: &[u8] = &[0; 64]; // Just an example
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let key = actix_web::cookie::Key::from(SESSION_SIGNING_KEY);
let host = "0.0.0.0";
let port = 8080;
HttpServer::new(move || {
App::new()
.wrap(
SessionMiddleware::builder(CookieSessionStore::default(), key.clone())
.cookie_secure(false)
.build(),
)
.service(session)
})
.bind((host, port))?
.run()
.await
}
如果我只更改端口号,编译过程最多需要 20 秒。
Compiling actix-test v0.1.0 (/home/sam/test)
Finished dev [unoptimized + debuginfo] target(s) in 20.90s
货物.toml
[package]
name = "actix-test"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
actix-files = "0.6.2"
actix-session = { version = "0.7.2" , features = ["cookie-session"] }
actix-web = "4.2.1"
env_logger = "0.9.3"
log = "0.4.17"
serde = { version = "1.0.147", features = ["derive"] }
大多数时候,开发人员在开发时以 debug 模式进行编译,这比以 release 模式编译要快得多,并且仅在需要时使用 release 模式,即用于他们想要实际部署/分发的二进制可执行文件。
如果“空”Actix 项目需要 18-20 秒来编译,您可能正在查看 release 模式的编译时间,并且您可能正在从单个(并且不是特别快)CPU 内核进行编译。从至少具有 4 个核心的强大 CPU 进行编译应该会显着降低构建时间 - 对于发布模式,可能需要大约 3-6 秒。
此外,可能值得一提的是,在将一些板条箱添加/更新到您的项目(在您的
Cargo.toml
文件中)之后第一次构建项目时,构建将比后续构建花费更长的时间。我假设您已经意识到这一点,但我提一下以防万一您忽略了这一部分。
问题出在 rust-analyzer 上。我使用的是 Neovim,但我也使用 VS-Code 进行了尝试,并得到了相同的结果。我认为 LSP 以某种方式锁定了包,因此 Cargo 每次都必须等待编译它......或者其他什么。
修复方法是终止 rust-analyzer 并重新启动编辑器。我的微小更改的编译时间现在低至两秒,平均约为五秒。