我写了一个这样的类:
class vector3D{
public:
double x,y,z;
}和I重载+运算符:
class vector3D{
public:
double x,y,z;
vector3D operator+(const vector3D &lhs)
{
vector3D temp(x+lhs.x,y+lhs.y,z+lhs.z);
return temp;
}
}但是使用C=A+B的速度要慢于
C.x = A.x + B.x;
C.y = A.y + B.y;
C.z = A.z + B.z;我想这是因为在+重载函数中定义了一个vector3D实例。有什么办法可以避免这种情况吗?
(仅供参考:我使用此标志构建:-Wall -Wextra -Wunreachable-code -m32 -DNDEBUG -O2 -D_LARGEFILE64_SOURCE -D_REETRANT -D_THREAD_SAFE)
EDIT:这是我测试两种方法的速度的方法(在main()中):
//test bench
vector3D A(0.0,0.0,0.0), B(1e-9,1e-9,1e-9);
clock_t c = clock();
//case A
for(long int i=0;i<1000000000;i++)
{
A = A + B;
}
cout<<"case A took: "<<1.0*(clock()-c)/CLOCKS_PER_SEC<<A<<endl;
c = clock();
//case B
for(long int i=0;i<1000000000;i++)
{
A._x = A._x+B._x;
A._y = A._x+B._y;
A._z = A._x+B._z;
}
cout<<"case B took: "<<1.0*(clock()-c)/CLOCKS_PER_SEC<<A<<endl;结果是:
case A took: 5.539[1, 1, 1]
case B took: 1.531[2, 2, 2]发布于 2015-07-05 01:47:21
由于您正在创建一个额外的对象,因此它将带来一些开销。这是天生的。
但是,看看您想要的“有效负载行”,它们与您在operator+=主体中添加一些other的内容非常相似
vector3D &operator+=(const vector3D &other) // Note - no objects created.
{
x += other.x;
y += other.y;
z += other.z;
return *this; // Note - return by reference.
}当然,operator+=修改了它的左操作数(这就是为什么使用operator+来创建对象的原因)。
通常,对于适用的重物,应首选operator+= (另请参见this question)。
发布于 2015-07-05 01:58:07
通过将其压缩为一行并利用返回值优化,您实际上可以获得性能提升
vector3D operator+(const vector3D &lhs)
{
return vector3D(x+lhs.x,y+lhs.y,z+lhs.z);
}https://stackoverflow.com/questions/31223320
复制相似问题