考虑以下功能
计算上述功能将花费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中遇到过这个问题,我想知道这个问题是否有解决方案,因为我还没有能够找到任何直到现在。
答案 0 :(得分: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;
}
}
根据您的指标,每个案例会减少一个变量分配。 (但是,无论如何,任何体面的编译器都会优化它。)
答案 1 :(得分:0)
你可以通过不作为no来减少1次操作,并在你的开关中直接使用randomNumber()的返回值,你也忘记了切换后的中断,除非是故意的。
switch(randomNumber())
{
case 0: returnNumber = a+b;break;
case 1: returnNumber = c+d;break;
default: returnNumber = e;
}
答案 2 :(得分: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;
}
}