将 switch/case 替换为 #ifdef 或类似的东西
Replace switch/case by #ifdef or something similar
我正在尝试用其他工具替换 switch/case
结构,但性能更好(执行时间更短......),我想到了 #ifdef
方法但我不知道如何在这种情况下使用它:
float k_function(float *x,float *y,struct svm_model model)
{
int i;
float sum=0.0;
switch(model.model_kernel_type)
{
case LINEAR :
return result1;
case POLY :
return result2;
case RBF :
return result3;
case SIGMOID :
return result4;
default :
return 0;
}
}
PS :
typedef enum kernel_type {LINEAR, POLY, RBF, SIGMOID};
正如我已经评论过的,我不相信预处理器语句是您要找的东西。要使用预处理器条件,model.model_kernel_type
需要是使用 #define
语句定义的常量。
我不知道 switch 语句的内部结构,因为它可能是 O(n) 或 O(1),具体取决于编译器如何处理它。如果您需要确定 O(1) 时间复杂度,您可以简单地用查找 table 替换 switch 语句,如下所示:
float model_type_results[4] = {result1, result2, result3, result4};
...
return model_type_results[model.model_kernel_type];
我想问题不仅仅是 1 个 case 语句,而是散落着类似 case 语句的代码。
c++ 虚函数 table 是一个类似的概念,用于避免这些类型的 case 语句在代码中激增。在 C 结构中实现函数 table 语义实际上并不难。
传统上,它们只是写成成员函数指针,但是如果有很多对象,使用单个每个 class 函数 table 指针会更 space 有效每个 class.
#ifdef
是编译时操作,而不是 运行 时操作。这不是您在这里寻找的解决方案。
老实说,如果您的 switch
只包含四个案例,那么您可以做很多改进。如果您在这里看到任何类型的减速,那就是您的结果是如何计算的(您没有显示)。
我正在尝试用其他工具替换 switch/case
结构,但性能更好(执行时间更短......),我想到了 #ifdef
方法但我不知道如何在这种情况下使用它:
float k_function(float *x,float *y,struct svm_model model)
{
int i;
float sum=0.0;
switch(model.model_kernel_type)
{
case LINEAR :
return result1;
case POLY :
return result2;
case RBF :
return result3;
case SIGMOID :
return result4;
default :
return 0;
}
}
PS :
typedef enum kernel_type {LINEAR, POLY, RBF, SIGMOID};
正如我已经评论过的,我不相信预处理器语句是您要找的东西。要使用预处理器条件,model.model_kernel_type
需要是使用 #define
语句定义的常量。
我不知道 switch 语句的内部结构,因为它可能是 O(n) 或 O(1),具体取决于编译器如何处理它。如果您需要确定 O(1) 时间复杂度,您可以简单地用查找 table 替换 switch 语句,如下所示:
float model_type_results[4] = {result1, result2, result3, result4};
...
return model_type_results[model.model_kernel_type];
我想问题不仅仅是 1 个 case 语句,而是散落着类似 case 语句的代码。
c++ 虚函数 table 是一个类似的概念,用于避免这些类型的 case 语句在代码中激增。在 C 结构中实现函数 table 语义实际上并不难。
传统上,它们只是写成成员函数指针,但是如果有很多对象,使用单个每个 class 函数 table 指针会更 space 有效每个 class.
#ifdef
是编译时操作,而不是 运行 时操作。这不是您在这里寻找的解决方案。
老实说,如果您的 switch
只包含四个案例,那么您可以做很多改进。如果您在这里看到任何类型的减速,那就是您的结果是如何计算的(您没有显示)。