委托与 if 语句
Delegate vs if statement
我有一个 class:
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 并从 class.
的外部调用它
你想多了。在这种情况下提高性能的最佳方法是使 MyClass 抽象,并定义两个子类:MyClassWithCalculations 和 MyClassWithoutCalculations。
当您要创建 MyClass 的实例时,检查参数:如果它为零,则实例化 MyClassWithoutCalculations。如果它不为零,则实例化 MyClassWithCalculations。没有代表,没有如果,没有复杂的东西。
话虽如此,我还要补充一点,您认为无辜的 if( variable == 0 )
语句会以任何重大方式影响性能的想法可能是错误的。
我在寻找改进现有应用程序性能的想法时遇到了这个问题。场景:
以 44 Hz(每 ~23 毫秒)的速率到达的更新流
更新只有16字节的数据
更新会发生什么(在输出到消费系统之前应该如何转换)取决于 Guid.
的值
那个Guid
...
- 更改相对不频繁 -- 不是 8 小时,然后是 10 分钟几次。
- 由于来自单独系统的调用而发生的变化。
objective 是为了减少接收更新和将值发布到消费系统之间的时间。
在我的场景中,if
语句在每次更新时检查 Guid
与 delegate
用于指向另一个函数 的成本为 4 毫秒。对我们来说,换掉它是值得的,因为我们所有其他优化都低于 1 毫秒。
我想真正的答案是“测试、测试、测试”,但我想我会分享我的经验。
我有一个 class:
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 并从 class.
的外部调用它你想多了。在这种情况下提高性能的最佳方法是使 MyClass 抽象,并定义两个子类:MyClassWithCalculations 和 MyClassWithoutCalculations。 当您要创建 MyClass 的实例时,检查参数:如果它为零,则实例化 MyClassWithoutCalculations。如果它不为零,则实例化 MyClassWithCalculations。没有代表,没有如果,没有复杂的东西。
话虽如此,我还要补充一点,您认为无辜的 if( variable == 0 )
语句会以任何重大方式影响性能的想法可能是错误的。
我在寻找改进现有应用程序性能的想法时遇到了这个问题。场景:
以 44 Hz(每 ~23 毫秒)的速率到达的更新流
更新只有16字节的数据
更新会发生什么(在输出到消费系统之前应该如何转换)取决于
的值Guid.
那个
Guid
...- 更改相对不频繁 -- 不是 8 小时,然后是 10 分钟几次。
- 由于来自单独系统的调用而发生的变化。
objective 是为了减少接收更新和将值发布到消费系统之间的时间。
在我的场景中,if
语句在每次更新时检查 Guid
与 delegate
用于指向另一个函数 的成本为 4 毫秒。对我们来说,换掉它是值得的,因为我们所有其他优化都低于 1 毫秒。
我想真正的答案是“测试、测试、测试”,但我想我会分享我的经验。