【发布时间】:2018-12-20 02:02:28
【问题描述】:
我无法确定对于我的应用程序来说,使用一个增长和缩小的 List 与使用一个大的 bool Array 是否更有效。
为了扩展这种比较和实际情况,以下是我认为我拥有的每个选项的示例:
选项 1(列表):
public List<int> list = new List<int>();
while (true) { // game loop
list.Add(Random.Range(0-300));
list.Add(Random.Range(0-300));
... // maximum of 10 of these can happen
if (list.Contains(42)) { // roughly 10 - 50 of these checks can be true
list.Remove(42);
}
}
选项 2(数组):
bool[] arr = new bool[300];
while (true) { // game loop
arr[Random.Range(0-300)] = true;
arr[Random.Range(0-300)] = true;
... // maximum of 10 of these can happen
for (int i = 0; i < 300; i++) {
if (arr[i]) { // roughly 10 - 50 of these checks can be true
arr[i] = false;
}
}
}
所以基本上我的问题是:
在什么时候过多的.Contains 检查变得比for 循环在每个可能的元素上更昂贵(基于我的范围)?
重要
这不是一个列表与数组的问题。由于条件检查,数据类型很重要。所以这是一个整数列表与布尔数组的比较,因为这两个选项可以给我相同的结果。
【问题讨论】:
-
您的两个版本的代码似乎没有做同样的事情。在某处打错字?
-
猜猜你应该搜索的是 contains 是如何实现的?根据 MSDN 文档,它进行线性搜索,所以 O(N),这有点类似于我猜的搜索数组。不错的链接@mjwills。
-
我不能只对它进行基准测试的原因是因为它不像将两者放在一起那么容易。我必须实际构建应用程序,在那个阶段我会过度投资于一个选项。在省略号
...之后发生了更多事情。 -
Contains(42)与数组的等价物将只是if(arr[42]),而要“删除”它只是arr[42] = false;,这显然更快。基本上,您用查找时间换取空间,这通常是与性能的权衡。要记住的另一个区别是列表可以包含重复项,但数组实现仅指示一个数字是否是随机选择的,而不是多少次。
标签: c# arrays list game-development