Я пытаюсь оптимизировать код, который мне пришлось реорганизовать. Код без каких-либо оптимизаций будет иметь некоторые операторы 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: Я знаю, что этот пример может выглядеть немым (поскольку рефакторинг там не выглядит очень полезным), но фактический код, который я рефакторинг, действительно нуждается в нем (верьте мне), поэтому я стараюсь не потерять производительность в финале код.
Общее правило заключается в том, что операторы switch
могут быть заменены поисковыми таблицами или массивами. Одно из преимуществ таблиц заключается в том, что их можно легко обновить с минимальными затратами на производительность и небольшими изменениями функции поиска (движка).
Вот несколько идей:
Если для условной проверки есть шаблон, поместите переменные в таблицу. Пусть двигатель выполнит проверку.
Поместите указатель функции в таблицу, чтобы выполнить проверку. Если указатель функции NULL, то проверки нет.
if (table[x] != NULL) table[x]();
через switch(x)
с помощью if (...)
, вероятно, является "отрицательным" или "нулем" - если только вы не можете каким-то образом устранить сложный if (...)
- однако, я сомневаюсь. Действительно, есть смысл использовать таблицу вместо switch
, но я не думаю, что это один из них.
switch
. Таблица поиска хороша для уменьшения проблем с обслуживанием.