【发布时间】:2017-08-12 14:23:53
【问题描述】:
在 Unity 中使用 foreach 循环时,我需要在更新方法中调用它。所以它每帧调用一次......
我想知道,在使用 foreach 循环之前检查列表的计数是否更好,或者它是否是多余的。
所以我有
if (myList.Count > 0)
{
foreach (Type type in myList)
{
}
}
和
foreach (Type type in myList) // no need for a check before
{
}
我也可以用
for (int i = 0; i < myList.Count; i++) // use a for loop instead
{
myList[i].DoSomething();
}
【问题讨论】:
-
你试过for循环吗?性能优于 foreach。 stackoverflow.com/a/365658/4662054
-
不需要检查。不要陷入这样的事情。如果您的程序运行缓慢,则不会通过在尝试迭代列表之前检查列表是否为空来加速它。 “过早的优化是万恶之源。” - 唐纳德·克努斯。
-
@OsmanSenol:我绝对建议不要假设 9 年前可能正确的性能特征仍然正确。 (特别是答案所指的博客文章不再存在 - 至少不在那个 URL 上。)
-
@OsmanSenol:那篇文章不仅在 Chrome 上无法阅读,而且确实似乎有错误:1) “好吧,简而言之,这里的 for-each 将在每次迭代时创建一个枚举器对象” - 不,枚举器只创建一次; 2) 对
foreach的实现方式的解释是不正确的——它发生存在List.Enumerator类型,但这不是一般模式; 3)List.Enumerator是一种值类型,至少在主要的 .NET 框架中是这样,所以我不希望有 any 额外的垃圾收集。也许 Mono Unity3d 正在使用的版本为此使用了引用类型?