cos () в math.h работает быстрее, чем x86 asm fcos.
Следующий код сравнивается между x86 fcos и cos () в math.h.
В этом коде 1000000 раз asm fcos стоит 150 мс; 1000000 раз, потому что () стоимость звонка составляет всего 80 мс.
Как fcos реализован в x86?
Почему fcos намного медленнее, чем cos ()?
Моя среда - Intel i7-6820HQ + win10 + visual studio 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.
На этом ноутбуке 1000000 раз fcos стоит всего 51 мс. Почему между двумя процессорами такая большая разница.