平方函数和在Rust中直接调用powi(2)之间有性能差异吗?

平方函数和在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编译器中,它们是等价的,生成完全相同的结果 您可以通过以下方式查看为这两种变体生成的装配代

在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