< 返回版块

odd-cat 发表于 2021-07-13 23:22

Tags:manning,icache,RefactoringToRust

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

《Refactoring to Rust》

摘要

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


并不总是iCache的原因

It’s Not Always iCache

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

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

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

本文作者通过使用若干有效的工具(perf/valgrind)对比了是否启用内联特性的代码性能和汇编指令,提出了内联可能造成代码变慢的另一种解释:

试考虑内联技术将函数S内联展开于函数C中:

  1. 内联使得C占用了更多的寄存器。由于函数S的代码直接在函数C的函数体中展开,造成函数C在程序上下文切换过程中加入了更多的push/pop指令,并且函数C的运行时栈的空间进一步膨胀。与内联版本中每次调用函数C都意味着这些新增的push/pop指令都会运行不同,未内联版本的push/pop指令只存在于函数S的上下文中,并且只有当函数C确实调用函数S时,这些指令才会被运行;
  2. 基于第一点的基本认识,现在设想函数S在流程控制语句中被调用(循环或条件分支等),编译器可能会提升函数S中的某些指令到条件分支之外,造成这些指令从冷路径变为热路径(冷热路径:因为条件分支可能不会执行,但是位于条件分支之外的代码总会执行,是为热路径);
  3. 在上述场景中,随着外层函数C的栈中局部变量和流程控制语句增多,编译器的优化反而使得热路径执行效率降低。

参考资料:


From 日报小组 odd-cat

社区学习交流平台订阅:

Rust.cc 论坛: 支持 rss

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

评论区

写评论

还没有评论

1 共 0 条评论, 1 页