委托vs if语句

时间:2015-02-05 11:05:52

标签: c# if-statement delegates

我有一个班级:

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并从类外部调用它。

2 个答案:

答案 0 :(得分:1)

你在考虑太多了。在这种情况下,提高性能的最佳方法是使MyClass成为抽象,并定义两个子类:MyClassWithCalculations和MyClassWithoutCalculations。 当您要创建MyClass的实例时,请检查参数:如果它为零,则实例化MyClassWithoutCalculations。如果它不为零,则实例化MyClassWithCalculations。没有代表,没有ifs,没有令人费解的东西。

有人说过,我还要补充一点,你认为无辜的if( variable == 0 )陈述可以以任何重要的方式影响表现,这可能是错误的。

答案 1 :(得分:0)

我在寻找想法以改善现有应用程序性能时遇到了这个问题。情况:

  • 更新流以44 Hz(每23ms)的速率到达

  • 更新仅是16个字节的数据

  • 更新发生了什么(在输出到使用系统之前应如何转换)取决于Guid.

    的值
  • 那个Guid ...

    • 不经常更改 -不更改8小时,而是在10分钟内更改几次。
    • 由于来自单独系统的呼叫而发生更改。

目标是减少从接收更新到将值发布到使用系统之间的时间。

在我的场景中,一条if语句在每次更新时检查Guid,而一条delegate则被用于指向另一个功能,花费4ms 。对于我们来说,值得交换掉,因为我们所有其他的优化都在1ms以下。

我想真正的答案是“测试,测试,测试”,但我想我会分享自己的经验。