2016-11-16 111 views
-2
的手段来降低这种功能的重量

考虑下面的函数考虑到通过代码

  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语句以及变量没有分配到randomNumber发生器功能

EDIT 2我碰到这个问题从我的一个朋友谁碰巧有在F2F面对这个问题,我想知道这个问题是否有解决方案,因为我还没有找到任何直到现在。

+0

对于现代处理器这些都是单一操作 – P0W

+1

如果这个随机数生成器比http://dilbert.com/strip/2001-10-25更好,那么调用它的成本将会使其他任何东西都变得渺茫。 –

+0

您是否忘记了每个案例后的“break”陈述? –

回答

8

正如最初编写的那样,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; 
    } 
} 

由你的指标将导致每箱少一个变量赋值。 (但是,任何体面的编译器都会优化它。)

+0

这是挑剔的,但伪随机数发生器通常有副作用,因此您应该调用'randomNumber();'与原始函数真正相等。 – user694733

+0

@ user694733好点。但是,我将假定'randomNumber()'是一个理想的随机(而不是伪随机)数字生成器。 ;) – jamesdlin

+0

@jamesdlin OP已经编辑了他的问题,现在有'break'语句,所以这个答案不再是答案。 –

0

您可以通过不忽略no来减少1操作,并且可以直接在您的switch中使用randomNumber()的返回值,并且您忘记了break开关的情况除非是有意的。

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

看起来不错,不知道还有什么要修改的功能。 – LeonardoGaleazzi

+0

@KapilBhandari:你不应该用答案和评论中的更正来编辑原始问题,它会使整个讨论不一致。顺便说一句,为了保持一致性,除非你让所有的例子都执行一个直接的'return',否则你应该在'default'原因中有一个'break'语句:这会使代码更加耐受进一步的编辑,并且更快视觉分析。 – chqrlie

+0

@chqrlie:请记住将来的问题谢谢 –

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; 
    } 
}