分配功能值之间的速度差异而不分配给变量

时间:2015-07-16 07:25:29

标签: c++ performance math assembly sin

所以这对我来说真的很神秘。我正在测量自己正弦函数的时间并将其与标准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;
}

1 个答案:

答案 0 :(得分:3)

在任何现代编译器中,编译器都会知道诸如sincosprintf("%s\n", str)等函数,并且要么转换为更简单的形式[如果值为常量则为常量, printf("%s\n", str);成为puts(str);]或完全删除[如果已知函数本身没有&#34;副作用&#34;,换句话说,它只是计算返回值,并且没有以其他方式对系统的影响]。

即使编译器处于低优化模式甚至没有优化模式,即使对于标准功能也经常发生这种情况。

您需要确保函数的结果真的用于在优化模式下调用它。在循环中将返回的值一起添加...