如何获得更快的 Rust Web 项目编译时间?

问题描述 投票:0回答:2

我一直在开发一个为网站生成静态内容的 Rust 程序。在我的机器上,它的构建时间约为 600 毫秒(不是很好,但完全可以管理)。

我想添加一些动态内容,所以我正在尝试 Actix-Web,但它已将编译时间增加到大约 18-20 秒,这对我来说太长了。

我知道有两种方法可以解决这个问题:

  1. 将我的应用程序重写为 CGI 脚本。这消除了 Actix 依赖性,并且应该恢复我约 600 毫秒的编译时间。

  2. 将我的应用程序拆分为一个 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"] }
rust compilation webserver actix-web
2个回答
2
投票

大多数时候,开发人员在开发时以 debug 模式进行编译,这比以 release 模式编译要快得多,并且仅在需要时使用 release 模式,即用于他们想要实际部署/分发的二进制可执行文件。

如果“空”Actix 项目需要 18-20 秒来编译,您可能正在查看 release 模式的编译时间,并且您可能正在从单个(并且不是特别快)CPU 内核进行编译。从至少具有 4 个核心的强大 CPU 进行编译应该会显着降低构建时间 - 对于发布模式,可能需要大约 3-6 秒。

此外,可能值得一提的是,在将一些板条箱添加/更新到您的项目(在您的

Cargo.toml
文件中)之后第一次构建项目时,构建将比后续构建花费更长的时间。我假设您已经意识到这一点,但我提一下以防万一您忽略了这一部分。


2
投票

问题出在 rust-analyzer 上。我使用的是 Neovim,但我也使用 VS-Code 进行了尝试,并得到了相同的结果。我认为 LSP 以某种方式锁定了包,因此 Cargo 每次都必须等待编译它......或者其他什么。

修复方法是终止 rust-analyzer 并重新启动编辑器。我的微小更改的编译时间现在低至两秒,平均约为五秒。

© www.soinside.com 2019 - 2024. All rights reserved.