私はC++を使用して複雑なFFTアルゴリズムをコーディングしているので、クォータニオンやハミルトン-アイゼンスタインコードなどの代数的構造を実装する必要があります。アルゴリズムは、その構造の2D配列で機能します。それらをクラスとして実装することのオーバーヘッドは何でしょうか?別の方法で、クォータニオンクラスで構成される[M] [N]次元の配列を作成する必要がありますか、それとも[M] [N] [4]配列を作成し、[4]配列をクォータニオンとして使用する必要がありますか?クラスを使用する方が便利ですが、配列だけで作業するのではなく、M * Nクラスを作成してそのメソッドにアクセスするのは、それほどオーバーヘッドではないでしょうか。私は大きな画像処理のアルゴリズムをコーディングしているので、パフォーマンスは私にとって重要です。
2 に答える
私見では、これらをクラスとして実装することで、エラーを減らしてコードをより迅速に記述できるようになるため、より良いサービスが提供されます。測定を行って、それが重要である場合に何が最も効果的かを確認する必要がありますが、パフォーマンスのボトルネックとなっているのが実際にこのコードであることも確認してください。(必須のドナルド・クヌースの引用:「時期尚早の最適化はすべての悪の根源です」)。
ほとんどのコンパイラは、コードを最適化するのに非常に優れています。多くの場合、初期段階のテストを追加したり、データセットを最小化したりするなど、違いを生むのはこれらの低レベルのもの以外のものであることがわかります。
クォータニオンの場合でも、配列を内部的に使用してクラスを実装できます(実際に高速な場合)。これにより、違いの重要性はさらに低くなります。
たとえば、マルチコアマシンでアルゴリズムを並列に実行できることを確認したり、実際の計算でSSE命令を使用したりできるようにすることで、より適切に対応できる可能性があります。
クラスのオーバーヘッドについて:クラスに仮想関数がない限り、クラスを使用してもペナルティはありません。
したがって、たとえば、複素変数の配列は次のように記述できます。
std::complex<double> m[10][10];
ただし、STLコレクションクラスは動的割り当てを使用する傾向があり、場合によってはかなりのオーバーヘッドが発生するため、注意してください(つまり、を使用して配列を作成することはありませんvector< vector<> >
。
高速で最適化された行列/ベクトルクラスのためのEigenなどのライブラリの使用を調査することをお勧めします。