这是我的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
}
答案 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)