gpt4 book ai didi

c++ - 发布版本中成员函数和全局函数的性能差异

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:10 24 4
gpt4 key购买 nike

我实现了两个函数来执行两个Vector(不是std::vector)的叉积,一个是成员函数,另一个是全局函数,这里是关键代码(其他部分省略)

//for member function
template <typename Scalar>
SquareMatrix<Scalar,3> Vector<Scalar,3>::outerProduct(const Vector<Scalar,3> &vec3) const
{
SquareMatrix<Scalar,3> result;
for(unsigned int i = 0; i < 3; ++i)
for(unsigned int j = 0; j < 3; ++j)
result(i,j) = (*this)[i]*vec3[j];
return result;
}

//for global function: Dim = 3
template<typename Scalar, int Dim>
void outerProduct(const Vector<Scalar, Dim> & v1 , const Vector<Scalar, Dim> & v2, SquareMatrix<Scalar, Dim> & m)
{
for (unsigned int i=0; i<Dim; i++)
for (unsigned int j=0; j<Dim; j++)
{
m(i,j) = v1[i]*v2[j];
}
}

它们几乎相同,只是一个是有返回值的成员函数,另一个是全局函数,其中计算的值直接赋给一个方阵,因此不需要返回值。
实际上,我的意思是用全局成员替换成员成员以提高性能,因为第一个涉及复制操作。然而,奇怪的是,全局函数的时间成本几乎是成员函数的两倍。此外,我发现执行

m(i,j) = v1[i]*v2[j]; // in global function

需要更多的时间
result(i,j) = (*this)[i]*vec3[j]; // in member function

那么问题来了,成员函数和全局函数的这种性能差异是如何产生的呢?

谁能说说原因?
希望我已经清楚地提出了我的问题,对不起我糟糕的英语!

//-------------------------------------------- ------------------------------------------
更多信息补充:
以下是我用来测试性能的代码:

    //the codes below is in a loop
Vector<double, 3> vec1;
Vector<double, 3> vec2;
Timer timer;
timer.startTimer();
for (unsigned int i=0; i<100000; i++)
{
SquareMatrix<double,3> m = vec1.outerProduct(vec2);
}
timer.stopTimer();
std::cout<<"time cost for member function: "<< timer.getElapsedTime()<<std::endl;

timer.startTimer();
SquareMatrix<double,3> m;
for (unsigned int i=0; i<100000; i++)
{
outerProduct(vec1, vec2, m);
}
timer.stopTimer();
std::cout<<"time cost for global function: "<< timer.getElapsedTime()<<std::endl;
std::system("pause");

和捕获的结果:
enter image description here

你可以看到成员函数比全局函数快了将近两倍。

另外,我的项目是基于64位windows系统构建的,代码实际上是基于Scons构建工具生成静态lib文件,以及生成的vs2010项目文件。

我要提醒的是,这种奇怪的性能差异只出现在发布版本中,而在调试构建类型中,全局函数几乎比成员函数快五倍。(大约 0.10s vs 0.02s)

最佳答案

一种可能的解释:

对于内联,在第一种情况下,编译器可能知道 result(i, j) (来自局部变量)不使用别名 this[i]vec3[j] ,所以 this 的标量数组都不是也不vec3被修改。

第二种情况,从函数的角度来看,变量可能存在别名,所以分别写入m可能会修改 v1 的标量或 v2 , 所以 v1[i] 都不是也不v2[j]可以缓存。

你可以试试 restrict关键字扩展来检查我的假设是否正确。

关于c++ - 发布版本中成员函数和全局函数的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30422729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com