【发布时间】:2014-03-29 17:36:54
【问题描述】:
我记得在 Agner Fog 的优秀指南中,64 位 Linux 可以通过寄存器传递 6 个整数函数参数:
http://www.agner.org/optimize/optimizing_cpp.pdf
(第 8 页)
我有以下功能:
void x(signed int a, uint b, char c, unit d, uint e, signed short f);
并且我需要传递一个额外的无符号短参数,总共 7 个。但是,我实际上可以从现有的 6 之一推导出 7 的值。
所以我的问题是以下哪一项是更好的性能实践:
- 在 64 位 Linux 上将已计算的值作为第 7 个参数传递
- 不传递已经计算的值,而是使用现有的 6 个参数之一再次计算它。
有问题的操作是一个简单的位移:
unsigned short g = c & 1;
不完全了解 x86 汇编器我不太确定寄存器有多珍贵,以及将值重新计算为局部变量是否比通过函数调用作为参数传递更好?
我认为最好计算两次该值,因为这是一个非常简单的 1 个 CPU 周期任务。
编辑我知道我可以对此进行分析 - 但我也想了解这两种方法的幕后情况。有第 7 个参数是否意味着涉及缓存/内存,而不是寄存器?
【问题讨论】:
-
我会说这几乎是不可能预测的。您的函数可能是内联的,在这种情况下这并不重要。此外,乱序执行可以隐藏大量内存访问的延迟,使其确实很难预测。
-
“我实际上可以从现有的 6 个中推导出第 7 个的值。”我认为这是一个设计问题。
-
不管怎样,在函数中重新计算变量而不是传递变量以将内容保存在寄存器中的花哨名称是rematerialization。
-
@alk 设计问题是什么?如果您的函数需要所有七个变量并且第七个变量的计算成本很高,那么即使它们在逻辑上不是独立的,传递所有七个变量似乎也是合理的。
标签: c++ c linux performance optimization