luster: Rust实现的lua虚拟机
恶意占用crate名字这种行为必须抵制和唾弃
今天这位叫 liuchong国内开发者,上了reddit的热贴,希望这位朋友看到以后删除你恶意上传的crate。
Rust实现的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服务的命令行客户端
状态:WIP。支持从命令行轻松安全地通过Firefox Send服务上传和下载文件。Firefox Send可以通过安全、私密且受加密的链接发送文件,链接到期后文件将从网上彻底抹除。
rustsim第四期报告
报告里阐述了nphysics和nalgebra两个库进两个月以来的状态和改进。
Deno一瞥:JavaScript/TypeScript运行时
什么是Deno?
- 使用Rust实现
- JavaScript和Typescript运行时
- 实现ES5模块
可以简单地把Deno看作是Node.js的替代品。但是Deno旨在实现和浏览器相同的功能。你可以用Deno实现一个浏览器和服务器都可以使用的程序。Deno的前景可以,但是目前还属于早期阶段。
日报订阅地址: