为什么 Rust std fs 慢于 Python

看到了 xuanwo 的一篇 博客,感觉很有意思。 完整读一遍也可以,不过也可以看我的省流。 Python IO 比 C / Rust IO 更快 有人发现在 AMD Ryzen 9 5900X 和 AMD Ryzen 7 5700X 上访问页对齐的前10个 byte 会比其他偏移有更多的 L1 prefetch 和 load 的 miss 。 学过 x86 汇编的应该知道不同于 RISC ,x86 是有专门用于复制字符串的指令的。有人发现上述问题的底层原因来自于 AMD 对 FSRM(Fast Short REP MOV) 的实现,逆天的是在 Zen 3 上,访问页对齐的数据比不对齐慢。 更有趣的事情 作者发现将 C 的分配器换成 jemalloc 后速度就可以击败 Python 了,我个人猜测可能是 mmap 后分配的页对齐的内存使用了更多(也就是大于 glibc 的 10 byte)来存 meta data ,恰巧避免了这个硬件 bug 。 有人使用 eBPF profile 发现 Rust 和 Python 的 fs read 在系统调用的延迟上存在差距,Rust 更慢。 为了解决这个奇怪的性能问题,作者(开源大手子漩涡)和他的开源伙伴(包括了热心网友、国内开源大佬依云和一些内核开发者)使用了 strace, perf, eBPF 等各种性能分析工具,以及分析了各种可能导致性能问题的原因(内存大页、CPU 核亲和性、mmap 分配匿名内存、Linux 启动选项例如 Enable Mitigations、系统调用延迟等)。 有 朋友 告诉我「Intel 前几天刚出了 rep mov 导致的 Dos 漏洞」。 好消息是 FSRM 是微码实现,也许在未来的某一次更新就修好了🥰。 相关链接 Terrible memcpy performance on Zen 3 when using rep movsb

2023 11月 30 · 2 分钟 · vaaandark

Cargo Runner

最近在完成一个使用 Rust 语言编写 Linux 内核引导程序的项目 lboot ,其核心代码和原理在之前的博客中介绍过 UEFI 如何启动 Linux 。 因为不可能直接在 UEFI 环境下进行代码开发,所以我使用的是交叉编译的方法,目标平台是 x86_64-unknown-uefi 和 aarch64-unknown-uefi 。这就带来了一个问题,使用命令 cargo run 不能直接运行代码,必须使用 qemu 来模拟目标架构的执行。 ...

2023 10月 22 · 1 分钟 · vaaandark

Rust 自引用结构

今天和朋友交流的时候遇到了自引用问题,之前就在看 Rust Bible 的时候看到过,但是一直没用 Rust 写过什么数据结构,所以没有使用这个的机会,所以今天就来尝试一下。 ...

2023 2月 23 · 1 分钟 · vaaandark

用 Rust 重写星际译王

我经常有在终端查单词的需求,之前使用的是自己写的网络爬虫,原理是构造网址 “https://www.youdao.com/result?word={}&lang=en" 并访问,再通过解析 Html 文件获得单词解释。一个朋友说他用的是 sdcv ,星际译王的终端版本,可以支持离线词典。我也时常脱机工作,对离线词典的需求也不小,所以打算自己写一个支持 StarDict 格式离线词典的软件。 ...

2023 1月 25 · 5 分钟 · vaaandark

Rust闭包

Rust 支持函数式编程,因此高阶函数、闭包等特性都不可或缺。 本文主要参考了 Rust Course 和 Rust 标准库文档。 什么是闭包 闭包是在支持头等函数的编程语言中实现词法绑定的一种技术,与函数不同的是,它可以捕捉自由变量,这意味着即使脱离了闭包创建时的上下文也能正常运行。 ...

2022 4月 26 · 4 分钟 · vaaandark

Rust迭代器

最近一直在学习 Rust 语言,深感它的学习曲线很陡峭,因此会写几篇博客记录一下学习进度。 本文主要参考了 Rust Course 和 Rust 标准库文档。 什么是迭代器 迭代器(iterator),是确使用户可在容器对象(container,例如链表或数组)上遍访的对象,设计人员使用此接口无需关心容器对象的内存分配的实现细节。 ...

2022 4月 25 · 4 分钟 · vaaandark