分配函数值和不分配变量之间的速度差异

Speed difference between assign function value and not assign to a variable

本文关键字:分配 速度 之间 变量 函数      更新时间:2023-10-16

所以这对我来说真的是个谜。我在测量我自己的正弦函数的时间并将它与标准的sin()进行比较。但有一种奇怪的行为。当我使用函数只是独立的,如:

sin(something);

我得到的平均时间像(在10轮中测量1000000个调用)3.1276 ms对于标准正弦函数和51.5589 ms对于我的实现。但是当我使用这样的代码时:

float result = sin(something);

我突然得到76.5621 ms对于标准sin()和49.3675 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 << " msn";
    sum += timeD;
}

在任何现代编译器中,编译器将知道sin, cos, printf("%sn", str)等函数,并将其转换为更简单的形式[如果值为常数则为常数,printf("%sn", str);变为puts(str);]或完全删除[如果知道函数本身没有"副作用",换句话说,它只是计算返回值,并且在其他方面对系统没有影响]。

即使在编译器处于低优化模式甚至没有优化模式时,这种情况也经常发生在标准函数中。

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