【问题标题】:Any performance difference between sinf(), cosf() and sin(), cos()sinf()、cosf() 和 sin()、cos() 之间的任何性能差异
【发布时间】:2013-04-23 20:51:12
【问题描述】:

我的代码主要处理单精度浮点数。对超越函数的调用经常发生。现在,我正在使用 sin()、cos()、sqrt() 等——接受和返回double 的函数。当它只为 x87 编译时,我知道单精度和双精度之间没有区别。我阅读了 Agner Fog 的优化指南,但是这些函数的软件版本使用 SSE 指令对于单精度浮点数来说更快。

我的问题是编译器在遇到类似以下情况时是否会自动使用更快的函数:

float x = 1.23;
float y = sin(x);

或者舍入规则是否排除了这种优化?

只需进行搜索和替换并查看是否有任何性能提升就很容易了。麻烦的是我还需要指向这些函数的指针。在 MSVC 中,sinf()、cosf() 和友元是内联函数。因此,使用它们需要一些体操。在努力之前,我想知道它是否值得。

除了 MSVC,我还针对 gcc。

【问题讨论】:

  • 您确定对这些函数的调用确实会减慢速度并值得浪费时间思考吗?您是否对代码进行了概要分析?

标签: c compiler-optimization


【解决方案1】:

调用sin 时确实不需要演员表。事实上,如果您使用 C99 附带的 <tgmath.h> 标头,则会适得其反。这为您提供了类型通用宏,这些宏将根据您的参数选择正确的函数,而不是不幸的是目标类型。因此,如果您使用该标头(不确定这是否适用于 MS)

float x = 1.23;
float y = sin(x);

会在后台自动使用sinf

【讨论】:

  • 你是对的。使用强制转换,编译器会认为输入确实是双精度。我从问题中取出来了。
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2012-05-26
  • 2013-09-02
  • 2014-03-15
  • 2010-12-07
相关资源
最近更新 更多