#性能 #jinja #专注 #进程 # #dynja #dev-ex

dynja_derive

为dynja提供的进程宏

7个不稳定版本 (3个破坏性更新)

0.4.1 2024年1月11日
0.4.0 2024年1月11日
0.3.1 2024年1月10日
0.2.1 2024年1月10日
0.1.0 2024年1月9日

#23 in #jinja

Download history 37/week @ 2024-03-29 7/week @ 2024-04-05 4/week @ 2024-05-17 1/week @ 2024-05-24

每月71次下载
用于 dynja

AGPL-3.0

9KB
60

Dynja

dynja-logo

专注于DevEx和性能的Jinja伪引擎

为什么选择Dynja?

让我们看看两种替代方案

  • Askama:在基准测试中非常快,但开发体验不是很好,因为每次修改模板时都必须重新编译您的web服务器
  • MiniJinja:在基准测试中有不错的性能,但开发体验很棒,具有热重载,甚至可能还有实时重载

所以让我们两者兼而有之:使用MiniJinja进行调试模式(更好的DevEx),并使用Askama进行发布模式(更好的性能)

这就是Dynja的实质所在

如何使用?

dynja依赖项添加到您的Cargo.toml中,同时添加askama依赖项。由于minijinja依赖项仅用于内部,因此不需要,而askama需要在发布构建中导出。

[dependencies]
dynja = { version = "0.4", features = ["askama_release"] }
askama = "0.12"

现在您可以将dynja导入并像使用askama一样使用它。不错吧?

use dynja::Template;

#[derive(Template)]
#[template(path = "index.html")]
struct MyTemplate {
    name: &'static str,
}

fn main() {
    let template = MyTemplate { name: "Test" };
    println!("Template Render: {}", template.render().unwrap());
}

它将自动在调试时的minijinja和发布时的askama之间进行选择,所以您不必担心。

注意:如果您愿意,可以使用不带askama的dynja。只需在您的Cargo.toml中添加以下内容

dynja = "0.4"

它还对发布模式的minijinja进行了优化,但它的性能不会像askama那样好。

有关更多信息,请参阅注意事项部分。

祝您玩得开心!

基准测试

注意:这些基准测试没有正确执行,因此它们不代表真实世界场景。但它们确实让您看到了切换引擎时的差异。

在位于此存储库根目录的dynja_bench上进行了测试。

Dynja 0.4.0(调试)

Benchmarking: MiniJinja
<!DOCTYPE html>
<html>
  <head></head>

  <body>
    <h1>Dynja Benchmark</h1>
    <h2>Name: Tests</h2>
    <h2>Number: 1337</h2>
    <h2>Float: 420.0</h2>
  </body>
</html>

Iteration: 999999
Benchmark finished
Time taken to finish iterations: 103629ms (103s)

Dynja 0.4.0(发布 - features = ["askama_release"])

Benchmarking: Askama
<!DOCTYPE html>
<html>
  <head></head>

  <body>
    <h1>Dynja Benchmark</h1>
    <h2>Name: Tests</h2>
    <h2>Number: 1337</h2>
    <h2>Float: 420</h2>
  </body>
</html>

Iteration: 999999
Benchmark finished
Time taken to finish iterations: 937ms (0s)

发布构建的迭代速度比调试构建快约110倍。

顺便提一下,这个基准测试也并没有说 minijinja 的速度有多慢。为了实现模板的热重载,我们每次在 render() 时都必须清除 minijinja 的缓存模板,这意味着我们为了获得更好的开发体验而严重影响了它的性能。以下是在未启用 "askama_release" 功能的情况下,在发布模式下进行的测试结果。

Dynja 0.4.0(发布版)

Benchmarking: MiniJinja
<!DOCTYPE html>
<html>
  <head></head>

  <body>
    <h1>Dynja Benchmark</h1>
    <h2>Name: Tests</h2>
    <h2>Number: 1337</h2>
    <h2>Float: 420.0</h2>
  </body>
</html>

Iteration: 999999
Benchmark finished
Time taken to finish iterations: 2851ms (2s)

许可证

本项目根据 GNU AGPL-3.0 许可证授权。不允许使用更高版本。

请阅读项目根目录中的 LICENSE 文件以获取更多信息。

注意事项

尽管 MiniJinja 和 Askama 都与 Jinja 有关,但它们之间并不是100%兼容的。所以要注意不一致的地方!

在大多数情况下,MiniJinja 的较慢性能并不会像你想象的那样影响你。在上面的基准测试(发布模式)中,它仍然在1秒钟内渲染了350,754次模板,这对于一个Web服务器来说已经足够了。如果你真的需要那种性能优势,并且你知道你的模板在各个引擎之间都是兼容的,根据基准测试,Askama 仍然以每秒1,067,235次渲染的优势获胜。如果你需要确保调试模板与发布模板兼容,请坚持使用 MiniJinja。

依赖项

~270–720KB
~17K SLoC