Замените switch / case на #ifdef или что-то подобное - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь заменить структуру 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};

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Я полагаю, что проблема не в одном выражении, а в коде, который заполнен аналогичными выражениями.

Таблица виртуальных функций c ++ представляет собой аналогичную концепцию, позволяющую избежать распространения подобных выражений в коде. На самом деле не сложно реализовать семантику таблицы функций в структурах C.

Традиционно они были написаны как просто указатели на функции-члены, но использование одного указателя на таблицу функций для каждого класса более эффективно, если в каждом классе много объектов.

0 голосов
/ 06 июля 2018

#ifdef - это операция времени компиляции, а не операция времени выполнения. Это не решение, которое вы ищете здесь.

Честно говоря, если ваш switch содержит только четыре случая, вы не можете многое сделать, чтобы улучшить его. Если вы видите какое-либо замедление здесь, это то, как вычисляются ваши результаты (которые вы не показываете).

0 голосов
/ 06 июля 2018

Как я уже прокомментировал, я не верю, что заявления препроцессора - это то, что вы ищете. Чтобы использовать условный препроцессор, 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];
...