6

オフラティス拡散制限集約 (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++ を選択した方がよいということですか? 余分な関数呼び出しが追加されるため、プライベート メンバー データを避ける必要がありますか (たとえば、アセンブリでの呼び出しは高価です)。

4

2 に答える 2

11

あなたが概説している種類のことを考えると、そのいずれかについて C に大きな利点があることに驚かれることでしょう。あなたが言ったことに基づいて、あなたが行った比較は、最適化をほとんどまたはまったく有効にせずにコンパイルしたことに基づいていると思います。完全な最適化を有効にすると、それらも消えると思います。

長期的には、C++ の方が最適化の可能性が高くなります。行列演算でかなり一般的なもの (DLA シミュレーションに適用できるかどうかはわかりませんが) は式テンプレートです。これを使用すると、計算を「平坦化」して、そうでなければ必要になるデータのコピーを避けることができます。

結論: 非常に悪いことに、C++ は最終的に C とまったく同じになります (つまり、最悪の場合、C++ コードを実質的に C コードと同じように記述しても、パフォーマンスに違いは見られません)。せいぜい、C++ の追加機能 (特にテンプレート) によって、C では不可能または非常に非現実的な方法で最適化する機会が提供されます。

于 2013-05-25T16:59:18.030 に答える