所以这对我来说真的很神秘。我正在测量自己正弦函数的时间并将其与标准sin()进行比较。但是有一种奇怪的行为。当我使用这些函数时,如:
sin(something);
对于我的实现,我得到平均时间(在10轮中测量1000000次调用) 3.1276 ms 用于标准正弦函数, 51.5589 ms 。 但是当我使用这样的东西时:
float result = sin(something);
对于我的标准sin()和 49.3675 ms ,我突然 76.5621 ms 。我知道将值赋给变量需要一些时间,但为什么不给我的正弦添加时间呢?它或多或少相同,而标准的快速增加。
修改 我的测量代码:
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;
}
答案 0 :(得分:3)
在任何现代编译器中,编译器都会知道诸如sin
,cos
,printf("%s\n", str)
等函数,并且要么转换为更简单的形式[如果值为常量则为常量, printf("%s\n", str);
成为puts(str);
]或完全删除[如果已知函数本身没有&#34;副作用&#34;,换句话说,它只是计算返回值,并且没有以其他方式对系统的影响]。
即使编译器处于低优化模式甚至没有优化模式,即使对于标准功能也经常发生这种情况。
您需要确保函数的结果真的用于在优化模式下调用它。在循环中将返回的值一起添加...