Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分配函数值和不分配给变量之间的速度差_C++_Performance_Math_Assembly_Trigonometry - Fatal编程技术网

C++ 分配函数值和不分配给变量之间的速度差

C++ 分配函数值和不分配给变量之间的速度差,c++,performance,math,assembly,trigonometry,C++,Performance,Math,Assembly,Trigonometry,所以这对我来说真的是个谜。我正在测量自己正弦函数的时间,并将其与标准sin()进行比较。不过有一种奇怪的行为。当我单独使用这些函数时,如: sin(something); 对于标准正弦函数,我得到的平均时间为3.1276 ms,对于我的实现为51.5589 ms。 但是当我使用这样的东西时: float result = sin(something); 对于标准sin()和我的sin()我突然得到76.5621 ms,对于我的sin()我得到49.3675 ms。我知道将值赋给变量需要一些时

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

sin(something);
对于标准正弦函数,我得到的平均时间为3.1276 ms,对于我的实现为51.5589 ms。 但是当我使用这样的东西时:

float result = sin(something);
对于标准sin()和我的sin()我突然得到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 << " ms\n";
    sum += timeD;
}
流文件的
(“result.txt”,ios::trunc);

文件在任何现代编译器中,编译器都会知道诸如
sin
cos
printf(“%s\n”,str)
等函数,或者转换为更简单的形式[如果值是常量,则转换为常量,
printf(“%s\n”,str);
变成
put(str);
][如果知道函数本身没有“副作用”,换句话说,它只计算返回值,并且在其他方面对系统没有影响]

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


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

在任何现代编译器中,编译器都会知道函数,例如
sin
cos
printf(“%s\n”,str)
和更多,或者转换为更简单的形式[如果值是常量,
printf(“%s\n”,str);
变成
put(str);
]或者完全删除[如果知道函数本身没有“副作用”,换句话说,它只计算返回值,并且在其他方面对系统没有影响]

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


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

在任何现代编译器中,编译器都会知道函数,例如
sin
cos
printf(“%s\n”,str)
和更多,或者转换为更简单的形式[如果值是常量,
printf(“%s\n”,str);
变成
put(str);
]或者完全删除[如果知道函数本身没有“副作用”,换句话说,它只计算返回值,并且在其他方面对系统没有影响]

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


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

在任何现代编译器中,编译器都会知道函数,例如
sin
cos
printf(“%s\n”,str)
和更多,或者转换为更简单的形式[如果值是常量,
printf(“%s\n”,str);
变成
put(str);
]或者完全删除[如果知道函数本身没有“副作用”,换句话说,它只计算返回值,并且在其他方面对系统没有影响]

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


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

我想说,编译器在一种情况下成功地优化了
sin(x)
不是op.Hmm,所以您认为编译器有一些这样的函数列表?因为它显然不包括用户函数。您测量的方式可能有问题。您可以发布分析代码吗?首先,您是否在发布模式下测量?您应该添加所有sin()将值返回到g,并在循环和时间测量后打印出来。然后编译器无法优化对sin()的调用(从而优化整个循环)。我想说,在一种情况下,编译器通过看到
sin(x)成功地进行了优化
不是op.Hmm,所以您认为编译器有一些这样的函数列表?因为它显然不包括用户函数。您测量的方式可能有问题。您可以发布分析代码吗?首先,您是否在发布模式下测量?您应该添加所有sin()将值返回到g,并在循环和时间测量后打印出来。然后编译器无法优化对sin()的调用(从而优化整个循环)。我想说,在一种情况下,编译器通过看到
sin(x)成功地进行了优化
不是op.Hmm,所以您认为编译器有一些这样的函数列表?因为它显然不包括用户函数。您测量的方式可能有问题。您可以发布分析代码吗?首先,您是否在发布模式下测量?您应该添加所有sin()将值返回到g,并在循环和时间测量后打印出来。然后编译器无法优化对sin()的调用(从而优化整个循环)。我想说,在一种情况下,编译器通过看到
sin(x)成功地进行了优化
不是op.Hmm,所以您认为编译器有一些这样的函数列表?因为它显然不包括用户函数。您测量的方式可能有问题。您可以发布分析代码吗?首先,您是否在发布模式下测量?您应该将所有sin()返回值添加到g中,然后打印出来