重构此代码以提高性能

时间:2013-01-07 15:58:51

标签: c# performance refactoring

这样的事情:

组件(A):

private void MoveItems(someCollection)
{
   // more code....

   foreach( item x in someCollection)
   {
      int x = getXFoo();
      assemblyB.UpdateOrderView(x)
   }

   //more code....
}

大会(B):

private void UpdateOrderView(x)
{
    // more code....

    int y = this.ListCount();

    //......

    FinishDisplay(y)
}

我们打电话给MoveItems(),它有一个集合和for-each循环。因此,如果集合中有600个项目,我们也会调用FinishDisplay()方法600次。但这就是我需要重构的地方。我不需要每次为集合中的每个项目调用FinishDisplay()。如果我可以在最后调用一次,那就足够了。

所以我正在寻找一种重构此代码的方法,以便FinishDiplay()只被调用一次。我控制了源代码,所以如果我需要公开某些方法或者创建一些方法的重载,我也可以这样做。

2 个答案:

答案 0 :(得分:5)

假设FinishDisplay的来电由于某种原因必须留在UpdateOrderView内,您可以这样做:

private void UpdateOrderView(Whatever x, bool doDisplay)
{
    // more code....

    int y = this.ListCount();

    //......

    if (doDisplay) FinishDisplay(y);
}

如果没有,为什么不将它与自己的方法分开,并在评论中提到的foreach之后调用一次?

答案 1 :(得分:5)

您可能需要FinishDisplay public并在消费者中调用它而不是UpdateOrderView。如果您需要更通用或显式的界面,您可以实现类似Windows Form的Control.SuspendLayoutControl.ResumeLayout方法的模式:

private bool autoFinish = true;

public void SuspendAutoFinish() { this.autoFinish = false; }
public void ResumeAutoFinish() { this.autoFinish = true; FinishDisplay(); }

private void UpdateOrderView() {
  // ...
  if(this.autoFinish) FinishDisplay();
}

// consumer
try {
  myImpl.SuspendAutoFinish();
  myImpl.MoveItems(myCollection);
}
finally {
  myImpl.ResumeAutoFinish();
}