c++ - 优化 C++ 模板执行

标签 c++ algorithm templates optimization

我正在从事性能至关重要的项目。该应用程序正在处理大量数据。代码是用 C++ 编写的,我需要做一些更改。

给出了以下代码(这不是我的代码,我将其简化为最少):

void process<int PARAM1, int PARAM2>() {
    // processing the data
}

void processTheData (int param1, int param2) { // wrapper

    if (param1 == 1 && param2 == 1) { // Ugly looking block of if's
        process<1, 1>();
    else if(param1 == 1 && param2 == 2) {
        process<1, 2>();
    else if(param1 == 1 && param2 == 3) {
        process<1, 3>();
    else if(param1 == 1 && param2 == 4) {
        process<1, 4>();
    else if(param1 == 2 && param2 == 1) {
        process<2, 1>();
    else if(param1 == 2 && param2 == 2) {
        process<2, 2>();
    else if(param1 == 2 && param2 == 3) {
        process<2, 3>();
    else if(param1 == 2 && param2 == 4) {
        process<2, 4>();
    }   // and so on....

}

主要功能:

int main(int argc, char *argv[]) {

    factor1 = atoi(argv[1]);
    factor2 = atoi(argv[2]);

    // choose some optimal param1 and param2
    param1 = choseTheOptimal(factor1, factor2);
    param2 = choseTheOptimal(factor1, factor2);

    processTheData(param1, param2); //start processing

    return 0;
}

希望代码看起来清晰。

功能:

  • process 是处理数据的核心功能,
  • processTheData 是流程函数的包装器。

参数(param1param2)采用的值数量有限(假设大约 10 x 10)。

param1param2 的值在执行前是未知的。

如果我简单地重写 process 函数,使其使用函数参数而不是模板常量(意味着 process(int PARAM1, int PARAM2)),那么处理过程大约是慢 10 倍。

由于上述原因,PARAM1PARAM2 必须是process 函数的常量。

有什么聪明的方法可以摆脱位于 processTheData 函数中的这个丑陋的 if block 吗?

最佳答案

像这样。

#include <array>
#include <utility>

template<int PARAM1, int PARAM2>
void process() {
    // processing the data
}

// make a jump table to call process<X, Y> where X is known and Y varies    
template<std::size_t P1, std::size_t...P2s>
constexpr auto make_table_over_p2(std::index_sequence<P2s...>)
{
    return std::array<void (*)(), sizeof...(P2s)>
    {
        &process<int(P1), int(P2s)>...
    };
}

// make a table of jump tables to call process<X, Y> where X and Y both vary    
template<std::size_t...P1s, std::size_t...P2s>
constexpr auto make_table_over_p1_p2(std::index_sequence<P1s...>, std::index_sequence<P2s...> p2s)
{
    using element_type = decltype(make_table_over_p2<0>(p2s));
    return std::array<element_type, sizeof...(P1s)>
    {
        make_table_over_p2<P1s>(p2s)...
    };
}


void processTheData (int param1, int param2) { // wrapper

    // make a 10x10 jump table
    static const auto table = make_table_over_p1_p2(
        std::make_index_sequence<10>(), 
        std::make_index_sequence<10>()
    ) ;

    // todo - put some limit checks here

    // dispatch
    table[param1][param2]();
}

关于c++ - 优化 C++ 模板执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46204012/

相关文章:

c++ - 如何将 GUID 值分配给变量?

c++ - 将函数逻辑分解为子函数

c++ - 使用 windows.h 和 WIN32_LEAN_AND_MEAN 时未定义时间

c++ - 在静态初始化期间创建和使用 vector 是否安全?

c# - float 组重采样

c++ - 相同的函数,类层次结构的不同返回类型

algorithm - 射箭游戏编程算法

Python 和 OpenCV - 改进我的车道检测算法

node.js - PUGJS - 如何访问本地人的数据?

unit-testing - 如何使用 Go 为 App Engine 指定模板路径以进行单元测试?