【Rust日报】2021-07-13 —— 曼宁新书推荐:《Refactoring to Rust》


曼宁新书推荐:《Refactoring to Rust》

《Refactoring to Rust》
https://www.manning.com/books/refactoring-to-rust

这本书试图教会你,如何把现有项目用 Rust 语言重构。 比较适合想在公司里推广 Rust 的朋友。

并不总是iCache的原因

It’s Not Always iCache
https://matklad.github.io/2021/07/10/its-not-always-icache.html

摘要: 众所周知,内联是一项很有用的代码优化技术。但有时候我们也常听到类似下面这样的观点:

内联也会使代码变慢,因为内联会增加代码的大小,使指令缓存变大并导致缓存未命中。

对于内联导致代码运行速度变慢的原因,不少人归结为内联使得iCache命中率降低,造成指令流水线在取码的过程中耗费更多的时间。

本文作者通过使用若干有效的工具(perf/valgrind)对比了是否启用内联特性的代码性能和汇编指令,提出了内联可能造成代码变慢的另一种解释: 试考虑内联技术将函数S内联展开于函数C中:

内联使得C占用了更多的寄存器。由于函数S的代码直接在函数C的函数体中展开,造成函数C在程序上下文切换过程中加入了更多的push/pop指令,并且函数C的运行时栈的空间进一步膨胀。与内联版本中每次调用函数C都意味着这些新增的push/pop指令都会运行不同,未内联版本的push/pop指令只存在于函数S的上下文中,并且只有当函数C确实调用函数S时,这些指令才会被运行;

基于第一点的基本认识,现在设想函数S在流程控制语句中被调用(循环或条件分支等),编译器可能会提升函数S中的某些指令到条件分支之外,造成这些指令从冷路径变为热路径(冷热路径:因为条件分支可能不会执行,但是位于条件分支之外的代码总会执行,是为热路径);

在上述场景中,随着外层函数C的栈中局部变量和流程控制语句增多,编译器的优化反而使得热路径执行效率降低。

参考资料:
- Inline In Rust:https://matklad.github.io/2021/07/09/inline-in-rust.html
- Scylla’s Approach to Improve Performance for CPU-bound workloads:https://www.scylladb.com/2017/07/06/scyllas-approach-improve-performance-cpu-bound-workloads/

From 日报小组 odd-cat

社区学习交流平台订阅:

Rust.cc 论坛: 支持 rss

微信公众号:Rust 语言中文社区

你可能感兴趣的:(java,python,编程语言,人工智能,js)