【发布时间】:2018-08-20 02:17:34
【问题描述】:
我有一个程序,它基本上可以计算 C++ 中一个非常大的向量的滚动平均值和其他滚动统计信息。对于大小为 N 的向量,我想获得另一个大小为 N 的向量,其中元素 k 包含从 0 到 k 的滚动统计信息。我将在下面使用滚动平均值进行说明。
该程序有一个对象,该对象具有根据新值和以前的统计值更新滚动统计信息的功能。例如:
inline float update(const float x) {
_n++;
_mean += (x - _mean)/_n;
return _mean;
}
现在想支持其他的统计计算,比如滚动标准差,计划是添加一个纯虚类作为基类,带有纯虚阶跃函数,创建不同的子类对应不同的统计类型.
我的问题是:因为 step 函数将是该函数的主要部分并且将被执行数十亿次,我是否应该期望从内联函数切换到虚拟函数会显着降低速度?对于我想做的事情,还有其他更有效的选择吗?或者我没有使用正确的设计模式,还有其他更好的方法吗?
【问题讨论】:
-
你不能总是保证得到内联代码,这取决于编译器。如果您打算更喜欢多态性,则会因为 vtable 而产生开销。
-
像这样的虚拟单步更新程序不会赢得任何基准测试。不过,将更新循环作为虚函数的一部分是合理的。
-
一般来说,虚拟函数的流行度和重要性都比以前要小得多。使用 lambda 二进制操作尝试 std::accumulate。
标签: c++ polymorphism