我即将编写一个非晶格扩散受限聚合 (DLA) 模拟,我想知道是使用 C 还是 C++。
出于设计原因,C++ 会很好,但我想知道 C 是否会表现得更好。当然,我了解算法性能并选择了最好的算法。所以我不是在谈论将 O(n^2) 改进为 O(log n) 或类似的东西。可以这么说,我正试图减少我的常数。
如果你不知道 DLA,它基本上归结为有一个双精度数组(大小在 10^3 和 10^6 之间),并在循环中选择随机双精度数来比较(大于/小于)数组的大部分。
因此,对此很重要的性能差异是数据访问和调用函数:
- 数据访问:C 结构与具有公共数据成员的 C++ 类与具有私有数据成员和访问器的 C++ 类。
- 调用函数:C 函数与 C++ 成员函数。
我是否可以得出结论,判断这一点的最终方法是查看汇编代码(例如比较移动/加载、跳转和调用的数量)?这当然取决于编译器(例如,您可以将糟糕的 C 编译器与好的 C++ 编译器进行比较)。我正在使用 Gnu 编译器(gcc 和 g++)。
我发现 gcc 和 g++ 生成的程序集在跳转次数(无)、移动/加载和调用以下两个程序方面几乎相同:
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++ 程序中使用私有成员数据,当我调用particles[0].setx(60.42) 时,我当然会在程序集中得到另一个调用。
这是否意味着我可以选择 C++ 作为 C,因为它们产生几乎相同的汇编代码?我应该避免私有成员数据,因为它增加了额外的函数调用(例如,在程序集中调用很昂贵)?