Уменьшение веса этой функции с помощью кода

Рассмотрим следующую функцию с учетом

  1. дополнение стоит 4 операции
  2. расходы по назначению 1 Операции
  3. Сравнительные затраты 1 Операции

Расчет вышеуказанной функции обойдется в 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, мне интересно, есть ли у этого вопроса решение или нет, так как я до сих пор не смог его найти.

-2

Решение

Как изначально написано, 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;
}
}

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

8

Другие решения

Вы можете уменьшить 1 Operation, не назначая no, и использовать возвращаемое значение randomNumber () непосредственно в вашем коммутаторе, также вы забыли разрыв после случая коммутатора, если он не был преднамеренным.

    switch(randomNumber())
{
case 0: returnNumber = a+b;break;
case 1: returnNumber = c+d;break;
default: returnNumber = e;
}
0

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

Кроме того, стоимость вызова функции и стоимости 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;
}
}
0
По вопросам рекламы [email protected]