通过代码来减少这个函数的权重

Reducing the weight of this Function by means of Code

本文关键字:函数 权重 代码      更新时间:2023-10-16

考虑以下函数

  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 增加了Switch语句中的Break语句,以及将变量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;
    }
}

,根据您的度量将导致每个情况下少一个变量赋值。(然而,任何像样的编译器都会将其优化掉。)

您可以通过不分配no来减少1个操作,并直接在您的开关中使用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;
    }
}