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
的结果,并且它已在此示例中进行了优化
将变量更改为volatile以强制cos
调用。
另一个猜测:也许你的cos实现使用查找表。然后它将比硬件实现更快。