Оптимизация конструкций переключателей - как избежать добавления предложений if [closed]

0

Я пытаюсь оптимизировать код, который мне пришлось реорганизовать. Код без каких-либо оптимизаций будет иметь некоторые операторы switch. Если внутри оператора switch возникает ошибка, возвращается вызывающий метод, например:

switch(var)
{ 
    case VAL1: 
    //do something... 
    break; 
    case VAL2: 
    //do something else... 
    //... 
    case VAL3: 
    if (...) // there is any case that can cause error 
    { 
         return error1;
    }
    break; 
    case VAL4: 
    if (...) // there is any case that can cause error 
    { 
         return error2;
    }
    break;
    case VAL5: 
    if (...) // there is any case that can cause error 
    { 
         return error1;
    }
    break;
    //and so on... 
    default: 
         break; 
} 

Я рефакторинг кода, поэтому я не возвращаю ошибку в инструкции switch, но вместо этого я отмечаю, что в переменной произошла ошибка:

int error_type = -1; 

switch(var)
{ 
    case VAL1: 
    //do something... 
    break; 
    case VAL2: 
    //do something else... 
    //... 
    case VAL3: 
    if (...) // there is any case that can cause error 
    { 
         error_type = error1;
    }
    break; 
    case VAL4: 
    if (...) // there is any case that can cause error 
    { 
         error_type = error2;
    }
    break;
    case VAL5: 
    if (...) // there is any case that can cause error 
    { 
         error_type = error1;
    }

    break;
    //and so on... 
    default: 
         break; 
}

if (error_type != -1) 
       return error_type; 

Проблема возникает, когда нет ошибки, потому что мы добавляем другую инструкцию if, которая может вызвать проблемы с производительностью, если метод вызывается много раз в секунду. Я бы не стал проверять условие каждый раз. Есть ли предложения по улучшению этого кода? Любые трюки с реорганизацией коммутатора?

//EDIT: Я знаю, что этот пример может выглядеть немым (поскольку рефакторинг там не выглядит очень полезным), но фактический код, который я рефакторинг, действительно нуждается в нем (верьте мне), поэтому я стараюсь не потерять производительность в финале код.

  • 1
    Каковы возможные значения для вар?
  • 1
    Есть ли общность в условиях if?
Показать ещё 10 комментариев
Теги:
optimization
performance
refactoring

1 ответ

2

Общее правило заключается в том, что операторы switch могут быть заменены поисковыми таблицами или массивами. Одно из преимуществ таблиц заключается в том, что их можно легко обновить с минимальными затратами на производительность и небольшими изменениями функции поиска (движка).

Вот несколько идей:

Если для условной проверки есть шаблон, поместите переменные в таблицу. Пусть двигатель выполнит проверку.

Поместите указатель функции в таблицу, чтобы выполнить проверку. Если указатель функции NULL, то проверки нет.

  • 0
    Однако производительность if (table[x] != NULL) table[x](); через switch(x) с помощью if (...) , вероятно, является "отрицательным" или "нулем" - если только вы не можете каким-то образом устранить сложный if (...) - однако, я сомневаюсь. Действительно, есть смысл использовать таблицу вместо switch , но я не думаю, что это один из них.
  • 0
    @MatsPetersson: переключение на поиск в таблице может не привести к повышению производительности в этом случае, но OP также упомянул проблему обслуживания, состоящую в постоянном добавлении наблюдений в оператор switch . Таблица поиска хороша для уменьшения проблем с обслуживанием.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню