为什么math.h中的cos函数比x86 fcos指令快

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么math.h中的cos函数比x86 fcos指令快相关的知识,希望对你有一定的参考价值。

math.h中的cos()运行速度比x86 asm fcos快。

下面的代码在math.h中的x86 fcos和cos()之间进行比较。

在此代码中,100万次asm fcos花费150ms; 1000000次cos()通话费用仅为80ms。

如何在x86中实现fcos?为什么fcos比cos()慢得多?

我的环境是英特尔i7-6820HQ + win10 +视觉工作室2017。

#include "string"
#include "iostream"
#include<time.h>
#include "math.h"

int main()
{
  int i;
  const int i_max = 1000000;

  float c = 10000;
  float *d = &c;

  float start_value = 8.333333f;
  float* pstart_value = &start_value;
  clock_t a, b;
  a = clock();

  __asm {
    mov edx, pstart_value; 

    fld [edx];
  }

  for (i = 0; i < i_max; i++) {
    __asm {
        fcos;
    }
  }


  b = clock();
  printf("asm time = %u", b - a);

  a = clock();
  double y;
  for (i = 0; i < i_max; i++) {
    start_value = cos(start_value);
  }

  b = clock();
  printf("math time = %u", b - a);
  return 0;
}

根据我个人的理解,单个asm指令通常比函数调用更快。为什么在这种情况下fcos这么慢?


更新:我在i7-6700HQ的另一台笔记本电脑上运行了相同的代码。在这台笔记本电脑上,100万次fcos只需51ms。为什么两个cpu之间存在如此大的差异。

答案

我打赌答案很简单。您不使用cos的结果,并且它已在此示例中进行了优化

https://godbolt.org/z/iw-nft

将变量更改为volatile以强制cos调用。

https://godbolt.org/z/9_dpMs

另一个猜测:也许你的cos实现使用查找表。然后它将比硬件实现更快。

以上是关于为什么math.h中的cos函数比x86 fcos指令快的主要内容,如果未能解决你的问题,请参考以下文章

math库函数都有啥

c++三角函数的快速实现

C语言中已知sin、cos的值怎么求角度?比如sina=0.2,那么a=?请求有经验的帮帮忙!

c语言中math.h和dos.h是干啥的

c语言中的反函数怎么计算?

为啥 GCC 为 C++ <cmath> 实现 isnan() 比 C <math.h> 更有效?