我即将编写一个非晶格扩散限制聚合(DLA)模拟,我想知道是否使用C或C++.
出于设计原因,C++会很好,但我想知道C会表现得更好.当然我了解算法性能并选择了最好的算法.所以我不是在谈论将O(n ^ 2)改为O(log n)或类似的.我试图减少我的常数.
如果您不了解DLA,它基本上归结为具有一系列双精度(大小在10 ^ 3和10 ^ 6之间)并且在循环中选择随机双精度来比较(大于/小于)阵列的大部分.
因此,对此重要的性能差异是数据访问和调用功能:
我是否正确地得出结论,判断这一点的最终方法是查看汇编代码(例如比较移动/加载,跳转和调用的数量)?这当然是编译器相关的(例如,您可以将糟糕的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;
}
Run Code Online (Sandbox Code Playgroud)
C++程序
class particle
{
public:
double x;
public:
double square()
{
return x*x;
}
};
int main()
{
particle* particles = new particle[10];
double res;
particles[0].x = …Run Code Online (Sandbox Code Playgroud)