我一直在研究一个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"] }
2条答案
按热度按时间rqenqsqc1#
大多数时候开发人员在开发时使用 debug 模式进行编译,这比使用 release 模式编译要快得多,并且只在需要时使用 release 模式,即对于他们想要实际部署/分发的二进制可执行文件。
如果一个“空”的Actix项目需要18-20秒的时间来编译,那么您可能正在查看 release 模式的编译时间,并且您可能正在从单个(并且不是特别快)CPU核心进行编译。在一个至少有4个内核的强大CPU上编译应该会大大减少构建时间--在发布模式下可能大约需要3-6秒。
另外,值得一提的是,在项目中添加/更新了一些crate(在
Cargo.toml
文件中)之后,第一次构建项目时,构建将比后续构建花费更长的时间。我想你已经意识到了这一点,但我提到它只是以防万一你忽略了这一部分。qojgxg4l2#
问题出在Rust-Analyzer上。我使用的是Neovim,但我也用VS-Code尝试了一下,得到了同样的结果。我认为LSP以某种方式锁定了包,因此Cargo每次都必须等待编译它...什么的。
修复方法是杀死rust-analyzer并重新启动编辑器。我的小改动的编译时间现在低至2秒,平均大约5秒。