1

例如,函数内部有硬逻辑void Func(long param1, long param2, long param3, long param4, long param5)

它里面有很多语句取决于参数,不同的检查,计算取决于组合等。

并且该函数被调用了数百万次并且需要大量的执行时间。我想减少那个时间。

所有参数均取自config.ini文件,因此在编译时它们是未知的。

但我知道,param1 可能在 diapason [1..3] 中,param2 在 diapason [0..1] 中等等。

所以,最后,这些参数可能有 200 种组合。

而且我希望我的编译器编译分离的200个组合,并且在运行时开始时,config.ini加载时只需选择其中一个,避免运行时计算参数的依赖关系。

这有可能在 C++98 中实现吗?还是在 C++11/14 中?

4

2 回答 2

2

使用模板当然可以做到这一点,因为模板可以有整数而不是类型参数。例如下面的函数

template <int iParam1, int iParam2>
int sum()
{
    return iParam1 + iParam2;
}

是一个函数,其中iParam1iParam2是特定模板实例化的固定值。例如,函数 sum<1, 2> 是一个始终返回的函数3

在你的情况下,Func用这个原型定义:

template <long Param1, long Param2, long Param3, long Param4, long Param5>
void Func()

然后,创建一个std::map将参数组合映射到固定这些参数的函数的函数。像这样的东西:

using ParamCombination = std::tuple<long, long, long, long, long>;

using ParamsToFunction = std::pair < ParamCombination, std::function<void()> >;

std::map< ParamCombination, std::function<void()> > map =
{
    ParamsToFunction(std::make_tuple<long, long, long, long, long>(1, 2, 2, 2, 2), Func<1, 2, 2, 2, 2>),
    ...
    // This map will contain pairs of all possible parameter combinations
    // and their corresponding functions. This is a long list but it can be
    // easily generated using a script.    
};

这些函数将具有编译时优化的所有好处。最后,在运行时,您需要做的就是创建一个表示参数组合的元组并调用此元组映射到的函数:

auto comb = ParamCombination(1, 2, 2, 2, 2);
map[comb](); // function call
于 2016-03-17T11:07:56.450 回答
0

我不知道您是否考虑过这一点,但您可以在开始时加载配置,计算您的 200 个可能的解决方案并将它们放入查找表中。这取决于您可以腾出的存储空间。由于您的组合数量似乎很少,这应该没问题。您只需将参数合并为整数。例如 ( x =[0...3]; y = [0...1]) => 对 x 使用前 2 位,对 y 使用第 3 位,依此类推。使用循环计算所有可能性。并将结果存储在数组中。如果您不拥有具有 2 次幂的参数。您可以简单地增加可能性。例如 x =[0...3] y =[0...5] z =[0...2] => idx = x + y*(x = 4 的可能性) + z * (pos. x = 4) * (位置 y = 6)

于 2016-03-17T10:15:50.600 回答