我正在尝试用其他工具替换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;
}
}
附言 :
typedef enum kernel_type {LINEAR, POLY, RBF, SIGMOID};
正如我已经评论过的,我不相信预处理器语句是你要找的。若要使用预处理器条件,model.model_kernel_type
需要是使用#define
语句定义的常量。
我不知道 switch 语句的内部结构,因为它可能是 O(n( 或 O(1(,具体取决于编译器如何处理它。如果你需要确定 O(1( 的时间复杂度,你可以简单地用一个查找表替换你的 switch 语句,如下所示:
float model_type_results[4] = {result1, result2, result3, result4};
...
return model_type_results[model.model_kernel_type];
我想问题不仅仅是 1 个案例语句,而是充斥着类似案例语句的代码。
c++ 虚函数表是一个类似的概念,用于避免这些类型的案例语句在代码中激增。在 C 结构中实现函数表语义实际上并不困难。
传统上,它们只是作为成员函数指针编写的,但如果每个类有许多对象,则使用单个每个类的函数表指针会更节省空间。
#ifdef
是编译时操作,而不是运行时操作。 这不是您在这里寻找的解决方案。
老实说,如果你的switch
只包含四个案例,你就没有太多可以改进的地方了。 如果您在这里看到任何类型的减速,那就是您的结果是如何计算的(您没有显示(。