曼宁新书推荐:《Refactoring to Rust》
摘要:
这本书试图教会你,如何把现有项目用 Rust 语言重构。 比较适合想在公司里推广 Rust 的朋友。
并不总是iCache的原因
摘要: 众所周知,内联是一项很有用的代码优化技术。但有时候我们也常听到类似下面这样的观点:
内联也会使代码变慢,因为内联会增加代码的大小,使指令缓存变大并导致缓存未命中。
对于内联导致代码运行速度变慢的原因,不少人归结为内联使得iCache命中率降低,造成指令流水线在取指的过程中耗费更多的时间。
本文作者通过使用若干有效的工具(perf/valgrind)对比了是否启用内联特性的代码性能和汇编指令,提出了内联可能造成代码变慢的另一种解释:
试考虑内联技术将函数S
内联展开于函数C
中:
- 内联使得
C
占用了更多的寄存器。由于函数S
的代码直接在函数C
的函数体中展开,造成函数C
在程序上下文切换过程中加入了更多的push/pop指令,并且函数C
的运行时栈的空间进一步膨胀。与内联版本中每次调用函数C
都意味着这些新增的push/pop指令都会运行不同,未内联版本的push/pop指令只存在于函数S
的上下文中,并且只有当函数C
确实调用函数S
时,这些指令才会被运行; - 基于第一点的基本认识,现在设想函数
S
在流程控制语句中被调用(循环或条件分支等),编译器可能会提升函数S
中的某些指令到条件分支之外,造成这些指令从冷路径变为热路径(冷热路径:因为条件分支可能不会执行,但是位于条件分支之外的代码总会执行,是为热路径); - 在上述场景中,随着外层函数
C
的栈中局部变量和流程控制语句增多,编译器的优化反而使得热路径执行效率降低。
参考资料:
From 日报小组 odd-cat
社区学习交流平台订阅:
1
共 0 条评论, 1 页
评论区
写评论还没有评论