【发布时间】:2019-05-03 23:25:25
【问题描述】:
我有一个计算物理代码(有限差分),它对大型数据数组(解决方案字段和系数字段)执行操作(导数)。
系数数据存储为具有重载() 运算符的Model 对象数组。
以下课程是我正在尝试做的一个示例:
class Model
{
public:
inline double operator () (double field)
{
return alpha*field;
}
private:
double alpha ;
}
应用程序将使用 Models 的数组:
std::vector<Model> models; // array of models
std::vector<double> input;
std::vector<double> output;
...
for (int i = 0; i < models.size(); i++)
{
output[i] = models[i](input[i]);
}
问题是使用() 运算符会产生很大的开销。
我已经按原样分析了代码,然后又删除了() 运算符并内联编写了代码。 (我使用的是 g++ 7.3.0.,在 Ubuntu 18.04 上运行)。我正在使用-Winline 进行编译,而 g++ 并没有抱怨它不能内联函数。
我还尝试使用static 函数代替() 运算符,并且没有相同的开销。不幸的是,静态函数无法访问成员变量。其他帖子表明这应该不是问题(例如C++ Non-static member functions overhead),但它似乎确实在这里。
所以我的问题是:这个非静态成员函数的开销来自哪里?
【问题讨论】:
-
您使用什么级别的优化?此代码与手动内联的代码在时间上的差异有多大?
-
... 在这个级别上,
std::hardware_destructive_interference_size可能会有所作为。编辑:我没有做过很多次,但是 - 避免缓存线冲突 - 它通常会更快。 -
你看生成的代码了吗?您使用了哪些编译器选项?
-
我查看了使用完全优化生成的代码,
operator()调用没有没有开销,因为它是内联的。您使用的是什么编译器和选项?
标签: c++ performance inlining