例如,函数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
时,只需选择其中一个,并避免运行时计算参数&#39 ; s依赖。
这可以在C ++ 98中实现吗?或者在C ++ 11/14中?
答案 0 :(得分:2)
从模板开始,使用模板肯定可以做到这一点 可以有整数而不是类型参数。例如, 以下功能
template <int iParam1, int iParam2>
int sum()
{
return iParam1 + iParam2;
}
是iParam1
和iParam2
是固定值的函数
特定的模板实例化。例如,函数和&lt; 1,2&gt;是
一个始终返回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
答案 1 :(得分:0)
我不知道你是否考虑过这个,但你可以在开始时加载配置,计算你的200个可能的解决方案并将它们放入查找表中。这取决于您可以节省的存储空间。由于您的组合数量似乎很小,这应该没问题。您可以简单地将参数合并为整数。例如。 (x = [0 ... 3]; y = [0 ... 1])=&gt;对于y,使用前2位用于x第3位,依此类推。使用循环计算所有可能性。并将结果存储在数组中。如果你没有拥有2的幂参数。你可以简单地增加可能性。例如,x = [0 ... 3] y = [0 ... 5] z = [0 ... 2] =&gt; idx = x + y *(x = 4的可能性)+ z *(位置x = 4)*(位置y = 6)