如何在没有太多复制/粘贴代码的情况下创建相同算法的优化变体?(C++)

How to create optimized variations of the same algorithm without too much copy/paste code? (C++)

提问人:user19179144 提问时间:2/7/2023 最后编辑:user19179144 更新时间:2/14/2023 访问量:91

问:

当我为实时优化目的(例如音频或图形处理)编写 C++ 代码时,我经常遇到以下问题:

我需要几种代码变体,但它们的内部循环只有一些微小的变化。大多数情况下,这种所需的变化是算法输出结果的方式。即,它是否应该替换输出缓冲区中的先前数据,是否应该将其与缓冲区中的先前数据相加,或者是否应该将其相乘,等等。

复制粘贴整个方法并仅更改内部循环中一行中的几个字符感觉像是一种糟糕的做事方式。

相当有效地解决这个问题的一种方法是始终使用一些简单的混合配方,您可以给出参数,例如:

*p_buffer++ = A*(*p_buffer) + B*new_value + C;

然后,您可以简单地将 A、B 和 C 交给该算法并完成它。但这感觉像是在浪费 CPU 周期。此外,如果缓冲区尚未使用有效的浮点值初始化,并且存在 NAN,则结果也可能是 NAN,即使您打算将缓冲区中的前一个值乘以 0。

那么,有没有另一种有效的方法可以在不牺牲速度的情况下为方法创建这些类型的变体呢?我希望为我使用的每个变体提供单独的方法。例如:

Render();
RenderAdditive(); 
RenderMultiplicative();
RenderSomeOtherWay();

编辑: 根据答案,我将方法定义为:

template<int TYPE> void Render(...)
{
    if constexpr (TYPE == 0)
        *p_output_buffer++ = data;

    if constexpr (TYPE == 1)
        *p_output_buffer++ += data;

    if constexpr (TYPE == 2)
        *p_output_buffer++ *= data;

}

这种方法效果很好。 感谢大家的帮助!

C++ 优化 方法 混合

评论

4赞 Jarod42 2/7/2023
可以使用模板(带函子)。替代的性能方法。std::function
3赞 user253751 2/7/2023
在 C++ 中,使用模板。要么是函子(正如 Jarod42 所建议的)要么if constexpr
1赞 Ignacio Gaviglio 2/7/2023
您可以对差异进行模板化处理(请参阅策略/策略模式)。
0赞 user19179144 2/14/2023
我根据收到的问题的想法和反馈,将我选择的方法添加到原始问题中。
0赞 HolyBlackCat 2/14/2023
通常不鼓励将解决方案编辑到问题中。您可以在下面将其作为“答案”发布,然后按它旁边的复选标记将您的问题标记为已解决吗?

答: 暂无答案