-3

我们正在编写一个将一些数据写入数组的方法(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 次)。

提前致谢!

4

5 回答 5

2

这可能会有所帮助(在任何一种情况下)

for (int i = 0; i < _dimension; )
{
    test[i++] = 0.0f;
    test[i++] = 1.0f;
}

我假设_dimension是偶数,但如果不是,很容易修复。

于 2013-04-21T08:31:05.067 回答
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;
}

当然,实际上你应该专注于使用发布模式来处理所有与性能相关的事情。

于 2013-04-21T08:27:25.290 回答
0

在您的示例代码中,您没有在构造函数中初始化 _dimension,而是在 MyFunc 中使用它。因此,即使您只分配了几千个条目,您也可能会在数组中填充数百万个条目。在有效的示例中,您使用相同的维度来创建和填充数组,因此在这种情况下您可能会正确初始化它..

只需确保 _dimension 已正确初始化。

于 2013-04-21T08:45:04.657 回答
0

尝试这个:

memset(test, 0, sizeof(float) * _dimension));
for (int i = 1; i < _dimension; i += 2)
{
    test[i] = 1.0f;
}

您也可以运行一次并将数组存储在静态位置。对于每次连续迭代,您无需任何计算即可处理存储的数据。

于 2013-04-21T09:25:00.687 回答
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;
        }
    }
}
于 2013-04-21T08:58:57.013 回答