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
}
我建议采用另一种方法,假设方块中的大多数值都不包含玩家,并且方块非常大只记住有玩家的位置,
应该是这样的:
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
语句。需要修改的是算法本身,而这样的修改无论如何都是计划好的。
- 将此方法的返回类型替换为int并删除强制转换给玩家
- if缓存一旦从该方法中删除if就会被设置当方法被调用 时,它总是为真
- 将array替换为single维度数组并通过不安全的固定方式访问