我有一个班级:
public class MyClass: IMyInterface
{
int _parameter;
public Myclass(int parameter)
{
_parameter = parameter;
//Do other things
}
public int FrequentlyCalledFunction()
{
if(_parameter == 0)
{
return 0;
}
else
{
int result;
//Do some calculations
return result;
}
}
}
由于_parameter在构造函数中被赋值一次,因此每次调用FrequentlyCalledFunction时输入if语句对于已创建的实例来说似乎效率低下。 因此,我想修改代码如下。宣布代表
public delegate int MyDlg();
public class MyClass: IMyInterface
{
int _parameter;
MyDlg _intermediate;
public Myclass(int parameter)
{
_parameter = parameter;
_intermediate = _parameter == 0 ? _returnZero : _calculateAndReturn;
//Do other things
}
public int FrequentlyCalledFunction()
{
return _intermediate();
}
int _returnZero()
{
return 0;
}
int _calculateAndReturn()
{
int result;
//Do some calculations
return result;
}
}
现在,检查将在创建实例时执行一次。另一方面,if语句被替换为另一个委托调用。
问题是,假设表现非常重要,哪种方法更好?
P.S。 FrequentlyCalledFunction是来自IMyInterface接口的方法,因此,我无法定义MyDlg FrequentlyCalledFunction并从类外部调用它。
答案 0 :(得分:1)
你在考虑太多了。在这种情况下,提高性能的最佳方法是使MyClass成为抽象,并定义两个子类:MyClassWithCalculations和MyClassWithoutCalculations。 当您要创建MyClass的实例时,请检查参数:如果它为零,则实例化MyClassWithoutCalculations。如果它不为零,则实例化MyClassWithCalculations。没有代表,没有ifs,没有令人费解的东西。
有人说过,我还要补充一点,你认为无辜的if( variable == 0 )
陈述可以以任何重要的方式影响表现,这可能是错误的。
答案 1 :(得分:0)
我在寻找想法以改善现有应用程序性能时遇到了这个问题。情况:
更新流以44 Hz(每23ms)的速率到达
更新仅是16个字节的数据
更新发生了什么(在输出到使用系统之前应如何转换)取决于Guid.
那个Guid
...
目标是减少从接收更新到将值发布到使用系统之间的时间。
在我的场景中,一条if
语句在每次更新时检查Guid
,而一条delegate
则被用于指向另一个功能,花费4ms 。对于我们来说,值得交换掉,因为我们所有其他的优化都在1ms以下。
我想真正的答案是“测试,测试,测试”,但我想我会分享自己的经验。