【发布时间】:2013-12-26 17:31:09
【问题描述】:
我对编程相当陌生,我需要一些优化方面的帮助。 基本上我的方法的一部分是:
for(int i = 0; i < Tiles.Length; i++)
{
x = Tiles[i].WorldPosition.x;
y = Tiles[i].WorldPosition.y;
z = Tiles[i].WorldPosition.z;
Tile topsearch = Array.Find(Tiles,
search => search.WorldPosition == Tiles[i].WorldPosition +
new Vector3Int(0,1,0));
if(topsearch.isEmpty)
{
// DoMyThing
}
}
所以我在当前 Tile 上方 1 个单位的位置搜索 Tile。
我的问题是,对于整个方法,它需要 0.1 秒,这会导致一个小问题。如果没有 Array.Find,该方法是 0.01 秒。
我也尝试了一个 for 循环,但仍然不是很好的结果,因为我还需要 3 次检查 底部,左侧和右侧..
有人可以帮助我并指出一种快速获得结果的方法吗? 也许我应该使用线程之类的东西?
【问题讨论】:
-
如果“查找”是一项您经常执行的操作并且它需要快速,则构建某种辅助存储——通常是字典——从搜索键映射到项目.字典针对快速搜索进行了优化。
-
@EricLippert,你知道我在想同样的事情,但后来又猜到了,因为你使用内存只是为了查找一个值。但是,既然您已经说明了;至少我走的是正确的思想流派。
-
@MichaelPerrenoud:您几乎总是可以用内存换取速度。这取决于哪种资源便宜。在移动设备上,以较低的速度换取较少的内存使用通常更明智;在台式机和服务器设备上,尤其是 64 位设备上,以更多的内存使用换取更高的速度通常是一种胜利。当然,您付出的代价不仅仅是更多的内存使用;它使数据结构更加复杂,可能会引入错误。而且您正在减慢每次插入的速度,以使每次查找速度更快。
-
@EricLippert,所以除非你在移动设备上,否则你会像证明数据库中的新索引一样证明它是合理的。查找速度可以提高几个数量级,但如果是高事务环境,则可能毫无价值。
-
@MichaelPerrenoud:正确;指数做出同样的权衡。由于必须维护索引属性,所有插入变得稍慢,并且由于索引数据必须存储在某处,数据库大小增加,但查找变为 O(lg n) 或 O(1) 而不是 O(n)。跨度>
标签: c# optimization