-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;
}

もちろん、実際には、パフォーマンス関連のすべてに Release-mode を使用することに集中する必要があります。

于 2013-04-21T08:27:25.290 に答える
0

サンプル コードでは、コンストラクターで _dimension を初期化しませんが、MyFunc で使用します。したがって、数千のエントリしか割り当てていない場合でも、配列内の数百万のエントリを埋めている可能性があります。動作する例では、配列の作成と入力に同じ次元を使用しているため、その場合はおそらく正しく初期化されています..

_dimension が適切に初期化されていることを確認してください。

于 2013-04-21T08:45:04.657 に答える