C++ 分配函数值和不分配给变量之间的速度差
所以这对我来说真的是个谜。我正在测量自己正弦函数的时间,并将其与标准sin()进行比较。不过有一种奇怪的行为。当我单独使用这些函数时,如: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(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中,然后打印出来