平方函数和在Rust中直接调用powi(2)之间有性能差异吗?
在Rust中,您可以将平方函数和在Rust中直接调用powi(2)之间有性能差异吗?,rust,Rust,在Rust中,您可以将(x*x)写成x.powi(2) 是否有任何理由/反对将(x*x)(除了可读性和个人偏好)包装到Rust中的函数/宏中,或者这等同于使用x.powi(2) (如果x.powi(2)中的常量2被折叠并转换为x*x)如果您觉得它读起来更好,这已经是定义它的理由。你需要一个更好的理由不这样做,我认为在这种情况下没有理由:阅读代码的人似乎不会对squared的作用感到困惑。不,在当前的Rust编译器中,它们是等价的,生成完全相同的结果 您可以通过以下方式查看为这两种变体生成的装配代
(x*x)
写成x.powi(2)
是否有任何理由/反对将(x*x)
(除了可读性和个人偏好)包装到Rust中的函数/宏中,或者这等同于使用x.powi(2)
(如果
x.powi(2)
中的常量2
被折叠并转换为x*x
)如果您觉得它读起来更好,这已经是定义它的理由。你需要一个更好的理由不这样做,我认为在这种情况下没有理由:阅读代码的人似乎不会对squared
的作用感到困惑。不,在当前的Rust编译器中,它们是等价的,生成完全相同的结果
您可以通过以下方式查看为这两种变体生成的装配代码:
选择一个频道并释放编译模式,然后按左上角的ASM
按钮。这是Rust v1.10的输出:
// square_mul:
mulsd %xmm0, %xmm0
retq
// square_pow:
mulsd %xmm0, %xmm0
retq
因此,Rust为两个函数生成完全相同的代码。即使在可读性的情况下,宏/函数是否应该使用
powi(2)
呢?你说得对,我指的是一个客观的、可测量的原因,应该这样说。重新措辞这个问题。通过改变你的问题,你已经做到了。尽管人们通常不赞成这样做,但有一种方法允许对离题问题进行此类编辑。我不确定这个问题是关于(1)x.powi(2)
vs.x*x
还是(2)x.powi(2)
vs.平方(x)
。也就是说,这是关于用户定义函数的内联,还是关于rustc“知道”将x.powi(2)
扩展到合适的地方?@trentcl,我从另一种使用squared(x)
的语言移植somce代码,我的问题是出于任何客观原因使用或不使用此约定。事实证明,答案是:“没有区别。因此,编写可读性最好的代码”。@ideasman42您接受的答案并没有解决函数调用开销问题,但只表明x*x
相当于x.powi(2)
<代码>平方(x)与这两种方法都不一样。您关心这个吗?您的示例显示,对于powi
案例,运行的“代码”(如果该程序集可以称为代码?)要多得多。这与你的观点背道而驰。也许这已经改变了,因为你发布了答案?
// square_mul:
mulsd %xmm0, %xmm0
retq
// square_pow:
mulsd %xmm0, %xmm0
retq