在大对象数组中查找对象参数需要花费太长时间吗? (C#)

时间:2012-04-23 00:40:57

标签: c# arrays performance

我正在制作一款基于平铺的2D游戏。我的一些测试级别有很少的瓷砖,有些有500,000用于测试目的。运行visual studio附带的性能分析器显示了瓶颈: the image must be here, it shows how <code>if (blocks[i].Visible)</code> takes 87% of time

为什么需要这么多时间的原因是什么?我该如何避免这种情况?

UPD:没关系,我只是通过整个阵列,而不是仅通过~200个可见的瓷砖。

4 个答案:

答案 0 :(得分:2)

.Visible是一种财产。要理解为什么这是一个瓶颈,您需要查看该getter的实现。虽然它看起来只是一个简单的布尔值,但它可能在幕后很复杂。

答案 1 :(得分:2)

并不是评估每个可见性属性/字段需要花费很多时间 - 这是你做了500k次 - 它加起来。由于这是分析器估计的瓶颈,这意味着绝大多数项目都将Visibility设置为false - 否则您会认为Draw()方法调用将显示为瓶颈。优化这种方法的一种方法可能是分离可见项目,只迭代这些项目。

答案 2 :(得分:1)

典型情况是500k吗?请记住,根据您的实际需求,复杂程度会有很大差异。

如果你真的需要处理500k的瓷砖,我会有第二个可见瓷砖列表,或者包含那些可见瓷砖的数组索引的整数列表。

答案 3 :(得分:1)

查找具有特定属性的对象的顺序检查意味着运行'n'次迭代的最坏情况,其中'n'是记录的总数。这肯定是一个瓶颈。

您可能希望单独保留一组可见项目。