If - return在我的应用中是一个巨大的瓶颈

本文关键字:一个 巨大 return 我的 应用 If | 更新日期: 2023-09-27 18:18:52

这是我的c#应用程序中的一段代码:

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

squareCacheValid是私有bool型,SquaresCache是私有int型[,]。

问题是应用程序运行得非常慢,任何优化都会使它变慢,所以我运行了一个跟踪会话。

我认为GetSquareCache()获得94.41%自己的时间,并且if和return几乎平均地分割该值(if为46%,return语句为44.82%)。这个方法也是点击cca。30秒15000次,有些测试甚至达到20000次。

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

我的问题是:是可能的,这些if/return语句使用了这么多的CPU时间?if语句GetSquareCache()被调用(它们总共被调用了相同的次数)怎么可能有最小的自己的时间?如果,是否有可能加快基本计算操作 ?

编辑: Player被定义为

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

If - return在我的应用中是一个巨大的瓶颈

我建议采用另一种方法,假设方块中的大多数值都不包含玩家,并且方块非常大只记住有玩家的位置,

应该是这样的:

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...
   }
}

问题就是这个方法被调用了太多次。实际上,在最后一次跟踪中,它获得了34,637毫秒,超过34122次命中,每次命中超过1毫秒。在反编译的CIL代码中,也有一些对局部变量的赋值,这些赋值在两个if分支的代码中都没有出现,因为它需要一个ret语句。需要修改的是算法本身,而这样的修改无论如何都是计划好的。

  1. 将此方法的返回类型替换为int并删除强制转换给玩家
  2. if缓存一旦从该方法中删除if就会被设置当方法被调用
  3. 时,它总是为真
  4. 将array替换为single维度数组并通过不安全的固定方式访问