如果 - return是我应用程序中的一个巨大瓶颈

时间:2014-08-21 06:01:17

标签: c# performance

这是我的C#应用​​程序的代码片段:

public Player GetSquareCache(int x, int y)
{
    if (squaresCacheValid)
        return (Player)SquaresCache[x,y];
    else
        //generate square cache and retry...
}

squareCacheValid是私人布尔,SquaresCache是私人uint [,]。

问题是应用程序运行速度极慢,任何优化只会让它变慢,所以我运行了一个跟踪会话。

我认为GetSquareCache()获得 94.41%自己的时间,if和return分割该值大部分均匀(if为46%,return语句为44.82%)。该方法也是命中cca。在30秒内完成15,000次,有些测试可达到20,000次。

在添加调用GetSquareCache()的方法之前,程序执行得很好,但使用的是随机值而不是实际的GetSquareCache()调用。

我的问题是:这些if/return语句可能耗费了这么多CPU时间吗?如何调用if语句GetSquareCache()(总共命中次数相同),拥有最少的自己的时间?是否有可能加快基本计算操作 if

修改:播放器定义为

public enum Player
{
    None = 0,
    PL1 = 1,
    PL2 = 2,
    Both = 3
}

3 个答案:

答案 0 :(得分:0)

我会建议采用不同的方法,假设方形中的大多数值都没有玩家,并且方形非常大只记住位置有球员,

看起来应该是这样的:

public class PlayerLocaiton
{
    Dictionary<Point, List<Player>> _playerLocation = new ...
    public void SetPlayer(int x, int y, Player p)
    {
      _playerLocation[new Point(x,y)].add(p); 
    }

    public Player GetSquareCache(int x, int y)
    {
      if (squaresCacheValid)
      {
           Player value;
           Point p = new Point(x,y);
           if(_playerLocation.TryGetValue(p, out value))
           {
                return value ;
           }

           return Player.None; 
      }
      else
        //generate square cache and retry...
   }
}

答案 1 :(得分:0)

问题在于方法被称为方式太多次了。事实上,它在最后一次追踪中获得了34,637毫秒,超过34,122次点击它获得的每次点击时间超过1毫秒。在反编译的CIL代码中,还有一些对于两个if分支中的代码中不存在的局部变量的赋值,因为它需要一个ret语句。算法本身就是需要修改的,并且无论如何都计划了这些修改。

答案 2 :(得分:0)

  1. 将此方法的返回类型替换为int并删除转换 发送者
  2. 如果要设置缓存,则从此方法中删除if     调用方法时总是如此
  3. 用单个替换数组         维度数组并通过不安全的固定方式访问它