Так что это действительно загадка для меня. Я измеряю время своей синусоидальной функции и сравниваю ее со стандартным грехом (). Хотя есть странное поведение. Когда я использую функции просто как:
sin(something);
Я получаю среднее время, как (измерения 1000000 звонков за 10 раундов) 3,1766 мс для стандартной функции синуса и 51,5589 мс для моей реализации.
Но когда я использую что-то вроде этого:
float result = sin(something);
Я получаю внезапно 76,5621 мс для стандартного греха () и 49,3675 мс для моего. Я понимаю, что для присвоения значения переменной требуется некоторое время, но почему это не добавляет времени и моему синусу? Это более или менее то же самое, в то время как стандартный быстро растет.
РЕДАКТИРОВАТЬ:
Мой код для измерения:
ofstream file("result.txt",ios::trunc);
file << "Measured " << repeat << " rounds with " << callNum << " calls in each \n";
for (int i=0;i<repeat;i++)
{
auto start = chrono::steady_clock::now();
//call the function here dattebayo!
for (int o=0; o<callNum;o++)
{
double g = sin((double)o);
}
auto end = chrono::steady_clock::now();
auto difTime = end-start;
double timeD = chrono::duration <double,milli> (difTime).count();
file << i << ": " << timeD << " ms\n";
sum += timeD;
}
В любом современном компиляторе компилятор будет знать такие функции, как sin
, cos
, printf("%s\n", str)
и многое другое, и либо перевести в более простую форму [константа, если значение является константой, printf("%s\n", str);
становится puts(str);
] или полностью удалить [если известно, что сама функция не имеет «побочных эффектов», другими словами, она ПРОСТО вычисляет возвращаемое значение и не оказывает влияния на систему другими способами].
Это часто происходит даже для стандартной функции, даже когда компилятор находится в режиме низкого уровня или даже не в режимах оптимизации.
Вы должны убедиться, что результат вашей функции ДЕЙСТВИТЕЛЬНО используется для ее вызова в оптимизированном режиме. Добавить возвращаемые значения вместе в цикле …