我正在从事性能至关重要的项目。该应用程序正在处理大量数据。代码是用 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 是流程函数的包装器。
参数(param1 和 param2)采用的值数量有限(假设大约 10 x 10)。
param1 和 param2 的值在执行前是未知的。
如果我简单地重写 process 函数,使其使用函数参数而不是模板常量(意味着 process(int PARAM1, int PARAM2)),那么处理过程大约是慢 10 倍。
由于上述原因,PARAM1 和PARAM2 必须是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/