オフラティス拡散制限集約 (DLA) シミュレーションを作成しようとしていますが、C と C++ のどちらを使用するか迷っています。
設計上の理由からは C++ が適していますが、C の方がパフォーマンスが優れているかどうか疑問に思っています。もちろん、私はアルゴリズムのパフォーマンスについて知っており、可能な限り最良のアルゴリズムを選択しています。したがって、O(n^2) を O(log n) などに改善することについて話しているのではありません。いわば定数を減らそうとしています。
DLA がわからない場合は、基本的に double の配列 (10^3 から 10^6 の間のサイズ) を持ち、ループ内でランダムな double を選択して (より大きい/より小さい) 配列の大部分と比較することになります。
したがって、これに関係するパフォーマンスの違いは、データ アクセスと関数の呼び出しです。
- データ アクセス: C 構造体とパブリック データ メンバーを持つ C++ クラスとプライベート データ メンバーとアクセサーを持つ C++ クラス。
- 関数の呼び出し: C 関数と C++ メンバー関数。
これを判断する最終的な方法は、アセンブリ コードを調べることであると結論付けるのは正しいですか (たとえば、移動/ロード、ジャンプ、および呼び出しの数を比較します)。もちろん、これはコンパイラに依存します (たとえば、ひどい C コンパイラと優れた C++ コンパイラを比較できます)。Gnu コンパイラ (gcc および g++) を使用しています。
gcc と g++ によって生成されるアセンブリは、ジャンプ (なし)、移動/ロード、および次の 2 つのプログラムの呼び出しの数に関してほぼ同じであることがわかりました。
Cプログラム
#include <stdlib.h>
typedef struct
{
double x;
} particle;
double square(double a)
{
return a*a;
}
int main()
{
particle* particles = malloc(10*sizeof(particle));
double res;
particles[0].x = 60.42;
res = square(particles[0].x);
return 0;
}
C++ プログラム
class particle
{
public:
double x;
public:
double square()
{
return x*x;
}
};
int main()
{
particle* particles = new particle[10];
double res;
particles[0].x = 60.42;
res = particles[0].square();
return 0;
}
C++ プログラムでプライベート メンバー データを使用すると、当然ながら、particle[0].setx(60.42) を呼び出すときにアセンブリで別の呼び出しが行われます。
これは、ほとんど同じアセンブリ コードが生成されるため、C ではなく C++ を選択した方がよいということですか? 余分な関数呼び出しが追加されるため、プライベート メンバー データを避ける必要がありますか (たとえば、アセンブリでの呼び出しは高価です)。