如何让Rust web项目的编译速度更快?

eqqqjvef  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(266)

我一直在研究一个Rust程序,它为网站生成静态内容。它在我的机器上大约600毫秒内构建(不是很好,但完全可以管理)。
我想添加一些动态内容,所以我尝试了Actix-Web,但它增加了编译时间约18-20秒,这对我来说太高了。
我知道有两种方法可以解决这个问题:
1.将我的应用程序重写为CGI脚本。这消除了对Actix的依赖,应该可以恢复我的~ 600 ms编译时间。
1.将我的应用程序拆分为一个Web服务器和一个二进制文件,每当访问路由时,Web服务器都会调用该二进制文件。这样,每次更改API时,我只需编译Web服务器,并且可以通过stdin/stdout与二进制文件进行交互。
这些看起来很难维护,所以我想知道Rust生态系统中是否有其他选择。有没有其他的Web框架可以使用?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

Cargo.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"] }
rqenqsqc

rqenqsqc1#

大多数时候开发人员在开发时使用 debug 模式进行编译,这比使用 release 模式编译要快得多,并且只在需要时使用 release 模式,即对于他们想要实际部署/分发的二进制可执行文件。
如果一个“空”的Actix项目需要18-20秒的时间来编译,那么您可能正在查看 release 模式的编译时间,并且您可能正在从单个(并且不是特别快)CPU核心进行编译。在一个至少有4个内核的强大CPU上编译应该会大大减少构建时间--在发布模式下可能大约需要3-6秒。
另外,值得一提的是,在项目中添加/更新了一些crate(在Cargo.toml文件中)之后,第一次构建项目时,构建将比后续构建花费更长的时间。我想你已经意识到了这一点,但我提到它只是以防万一你忽略了这一部分。

qojgxg4l

qojgxg4l2#

问题出在Rust-Analyzer上。我使用的是Neovim,但我也用VS-Code尝试了一下,得到了同样的结果。我认为LSP以某种方式锁定了包,因此Cargo每次都必须等待编译它...什么的。
修复方法是杀死rust-analyzer并重新启动编辑器。我的小改动的编译时间现在低至2秒,平均大约5秒。

相关问题