我们正在编写一个将一些数据写入数组的方法(myFunc)。该数组必须是该类的字段(MyClass)。 例如:
class MyClass {
public:
MyClass(int dimension);
~MyClass();
void myFunc();
protected:
float* _nodes;
};
MyClass::MyClass(int dimension){
_nodes = new float[dimension];
}
void MyClass::myFunc(){
for (int i = 0; i < _dimension; ++i)
_nodes[i] = (i % 2 == 0) ? 0 : 1;
}
方法myFunc被调用近10000次,需要9-10秒(使用其他方法)。
但是如果我们将myFunc定义为:
void MyClass::myFunc(){
float* test = new float[_dimension];
for (int i = 0; i < _dimension; ++i)
test[i] = (i % 2 == 0) ? 0 : 1;
}
我们的程序运行得更快 - 它需要2-3秒(如果它的密度接近10000次)。
提前致谢!
答案 0 :(得分:2)
这可能会有所帮助(在任何一种情况下)
for (int i = 0; i < _dimension; )
{
test[i++] = 0.0f;
test[i++] = 1.0f;
}
我假设_dimension
是偶数,但如果不是,则很容易修复。
答案 1 :(得分:1)
如果你想加速调试模式,也许可以帮助编译器,试试
void MyClass::myFunc(){
float* const nodes = _nodes;
const int dimension = _dimension;
for (int i = 0; i < dimension; ++i)
nodes[i] = (i % 2 == 0) ? 0.0f : 1.0f;
}
当然,实际上您应该专注于使用发布模式来处理与性能相关的所有内容。
答案 2 :(得分:0)
在您的示例代码中,您不在构造函数中初始化_dimension,而是在MyFunc中使用它。因此,即使您只分配了几千个条目,也可能填充数组中的数百万个条目。在可行的示例中,您使用相同的维度来创建和填充数组,因此在这种情况下您可能正确地初始化它。
确保_dimension已正确初始化。
答案 3 :(得分:0)
大多数计算机上的速度更快。
void MyClass::myFunc(){
float* const nodes = _nodes;
const int dimension = _dimension;
if(dimension < 2){
if(dimension < 1)
return;
nodes[0] = 0.0f;
return;
}
nodes[0] = 0.0f;
nodes[1] = 1.0f;
for (int i = 2; ; i <<= 1){
if( (i << 1) < dimension ){
memcpy(nodes + i, nodes, i * sizeof(float));
}else{
memcpy(nodes + i, nodes, (dimension - i) * sizeof(float));
break;
}
}
}
答案 4 :(得分:0)
试试这个:
memset(test, 0, sizeof(float) * _dimension));
for (int i = 1; i < _dimension; i += 2)
{
test[i] = 1.0f;
}
您也可以运行此片段并将数组存储在静态位置。 对于每次连续迭代,您都可以在不进行任何计算的情况下处理存储的数据。