Рассмотрим следующую функцию с учетом
Расчет вышеуказанной функции обойдется в 14 операций
int function1(int a,int b,int c, int d, int e)
{
int returnNumber;
//int no = randomNumber(); //Some Random Number Generator Function , Lets Assume the cost of this function to be 0 for simplicity purpose
switch(randomNumber())
{
case 0: returnNumber = a+b; // costs 6 Operations , Case Check costs 1, assignment costs 1 and addition costs 4
break;
case 1: returnNumber = c+d; // Costs 6 Operations
break;
default: returnNumber = e; // costs 2 Operations
}
return returnNumber;
}
Общая стоимость этой функции составляет 14 операций. Существует ли какой-либо код, который может сделать то же самое, а также снизить стоимость этой функции по крайней мере на 1?
РЕДАКТИРОВАТЬ 1
Добавлен оператор Break в операторах Switch, а также присвоение переменной no функции генератора randomNumber
РЕДАКТИРОВАТЬ 2 Я столкнулся с этим вопросом от моего друга, который, как оказалось, сталкивался с этим вопросом в F2F, мне интересно, есть ли у этого вопроса решение или нет, так как я до сих пор не смог его найти.
Как изначально написано, switch
блок не имел break
операторы, поэтому возвращаемое значение всегда будет результатом последнего случая, независимо от сгенерированного случайного числа. Таким образом, вся функция могла бы быть упрощена до:
int function1(int a,int b,int c, int d, int e)
{
return e;
}
Текущая версия может быть скорректирована на:
int function1(int a,int b,int c, int d, int e)
{
switch(randomNumber())
{
case 0: return a+b;
case 1: return c+d;
default: return e;
}
}
что по вашим метрикам приведет к одному меньшему количеству назначаемых переменных в каждом случае. (Однако любой приличный компилятор все равно оптимизировал бы его.)
Вы можете уменьшить 1 Operation, не назначая no, и использовать возвращаемое значение randomNumber () непосредственно в вашем коммутаторе, также вы забыли разрыв после случая коммутатора, если он не был преднамеренным.
switch(randomNumber())
{
case 0: returnNumber = a+b;break;
case 1: returnNumber = c+d;break;
default: returnNumber = e;
}
Стоимость этих операций не может быть оценена без учета фактического сгенерированного кода. И генерация кода зависит от многих факторов, таких как выбор цели, компилятора и параметров компиляции. Оптимизирующие компиляторы могут реорганизовать код для повышения эффективности или уменьшения размера кода, микрооптимизация на уровне операторов, например, то, что запрашивается здесь, является спорным вопросом.
Кроме того, стоимость вызова функции и стоимости switch
диспетчеризация, вероятно, затмит незначительные сроки отдельных операций.
Хранение результата в локальной переменной или его прямой возврат не должны иметь никакого значения для современных оптимизирующих компиляторов, это в основном вопрос соглашений по кодированию.
Если местные соглашения о кодировании указывают, что должен быть один return
Скажите, используйте это:
// the prototype for randomNumber should come from a header file
int randomNumber(void); //Some Random Number Generator Function
int function1(int a, int b, int c, int d, int e) {
int returnNumber;
switch (randomNumber()) {
case 0:
returnNumber = a + b;
break;
case 1:
returnNumber = c + d;
break;
default:
returnNumber = e;
break;
}
return returnNumber;
}
Если вы можете иметь несколько return
заявления, используйте более простую версию:
int function1(int a, int b, int c, int d, int e) {
switch (randomNumber()) {
case 0:
return a + b;
case 1:
return c + d;
default:
return e;
}
}