ChaosBot avatar

【Rust日报】 2019-03-04

blackanger

Published: 04 Mar 2019 › Updated: 04 Mar 2019【Rust日报】 2019-03-04

【Rust日报】 2019-03-04

luster: Rust实现的lua虚拟机

#lua #vm

luster


恶意占用crate名字这种行为必须抵制和唾弃

#crate

今天这位叫 liuchong国内开发者,上了reddit的热贴,希望这位朋友看到以后删除你恶意上传的crate。

img

Read More


Rust实现的Spotify客户端

#music #spotify

Spotify是一个数码音乐服务平台


ramhorns中的动态模板

#template_engine

ramhorns是一个实验性类Moustache的模板引擎。该作者(Pairtytech的工程师)写了这篇文章,主要记录他为ramhorns中动态模板提升性能的方案。

在Rust的世界里有很多模板引擎,可以分为静态模板和动态模板。

  • 静态模板引擎,在编译时渲染。比如Askama。
  • 动态模板引擎,需要在运行时进行渲染,比如Moustache,Handlebars和Zola(Rust实现的静态站点生成器)使用的Tera。

对于静态站点生成器,必须使用动态模板。而动态模板和Askama的性能存在5~30倍左右的差距。这让作者比较困惑,他在阅读了Askama和其他动态模板引擎的源码之后,发现Askama可以直接使用Rust类型渲染模板,而动态模板则需要一个中间结构表示,比如这种:

#[derive(Serialize)]
struct Post<'a> {
    title: &'a str,
    content: &'a str,
}

然后通过序列化和HashMap这类数据结构在运行时获取相应的字段和值去渲染模板。这虽然有效,但是这种中间结构付出了沉重的代价。并且对于已经存在内存中的数据结构是完全冗余的。作者罗列了可能出现的开销:

  • 如果要将字段名称和值转为字符串,则需要创建HashMap,这会双倍耗费堆内存。
  • 如果有一个Vec或者是一些其他要展现的东西,比如帖子列表。将不得不创建一个新的Vec和多个HashMap。
  • 每次对HashMap的插入和查找,都会有哈希处理带来的额外开销。

而静态模板引擎完全没有上述的开销。ramhorns如何优化?

使用宏来生成代码,并且使用比较字符串的hash值来代替直接比较字符串。使用了Fnv库。并且在模板预处理中使用相同的Hasher。

ramhorns中没有使用serde,而是使用了Content trait。利用宏,为Post结构生成如下代码:

impl<'a> Content for Post<'a> {
    fn render_field(&self, hash: u64, buf: &mut String) {
        match hash {
            // FNV-1a hash of "title"
            0xda31296c0c1b6029 => buf.push_str(&self.title),

            // FNV-1a hash of "content"
            0x420c75b526b35282 => buf.push_str(&self.content),

            // In Mustache fashion, do nothing if the field is not found
            _ => {},
        }
    }
}

这样就避免了在运行时使用HashMap。优化的结果如何?作者和其他的模板引擎做了性能测试,发现ramhorns不仅比其他动态引擎更快,而且还比静态引擎Askama更快(其实Askama也有很大改进空间,Wearte项目就是案例)。作者说,也许再过一段时间,Hugo就不会说自己是「世界上最快的」静态网站生成器了。


ffsend: Firefox Send服务的命令行客户端

#cli #file_share

状态:WIP。支持从命令行轻松安全地通过Firefox Send服务上传和下载文件。Firefox Send可以通过安全、私密且受加密的链接发送文件,链接到期后文件将从网上彻底抹除。


rustsim第四期报告

#rustsim

报告里阐述了nphysics和nalgebra两个库进两个月以来的状态和改进。

Read More


Deno一瞥:JavaScript/TypeScript运行时

#deno #js #typescript

什么是Deno?

  • 使用Rust实现
  • JavaScript和Typescript运行时
  • 实现ES5模块

可以简单地把Deno看作是Node.js的替代品。但是Deno旨在实现和浏览器相同的功能。你可以用Deno实现一个浏览器和服务器都可以使用的程序。Deno的前景可以,但是目前还属于早期阶段。

Read More


日报订阅地址:

Leave 【Rust日报】 2019-03-04 to:

Written by

Read more #rust posts


Best Posts From ChaosBot

We have not curated any of blackanger's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From ChaosBot