【问题标题】:Performance - before using a foreach loop check if the list is empty性能 - 在使用 foreach 循环之前检查列表是否为空
【发布时间】: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 正在使用的版本为此使用了引用类型?

标签: c# unity3d foreach


【解决方案1】:

如果列表为空,除非您需要一些特定的逻辑,否则 if 语句肯定是多余的。在 foreach 循环中,如果没有数据 - 它根本不执行循环。

不过,这或多或少是对最佳实践而非性能的关注。影响实际上是不存在的;但是,我认为至少了解这些类型的事情从来都不是一个坏主意。

【讨论】:

  • 大多数时候回答者开始抨击问这样的事情,比如在你需要优化之前测量等等。在这种情况下,你的回答将非常有用 - 讲述不存在的实用影响并且知道这些事情从来都不是一个坏主意。
【解决方案2】:

几乎可以肯定,性能差异可以忽略不计(但衡量它永远不会有坏处)。

另一方面,纯foreach 几乎适用于任何 集合,而使用for 循环或隐式检查Count(或LengthCount())假设集合是IList

因此,您有三个(可能)性能相同的选项,但其中一个比其他选项灵活得多。

【讨论】:

    猜你喜欢
    • 2021-02-25
    • 2020-03-04
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2021-05-13
    • 2019-03-06
    • 1970-01-01
    相关资源
    最近更新 更多