两个循环比一个循环更昂贵,重新组合C#中两个代码的代码?

Dav*_*vid 0 .net c# optimization refactoring

这可能是一个愚蠢的问题,但......

重构我的代码,我想出了一个我找不到任何答案的问题:

假设我有一个对象MyDumyObject包含字符串的属性FooBar

假设我也有一个MyDumyObject叫做的集合MyDumyCollection

foreach(MyDumyObject obj in MyDumyCollection)
{
    obj.Foo = "fooooooooo";
    obj.Bar = "baaaaaaaar";
}
Run Code Online (Sandbox Code Playgroud)

相当于

foreach(MyDumyObject obj in MyDumyCollection)
{
    obj.Foo = "fooooooooo";
}

foreach(MyDumyObject obj in MyDumyCollection)
{
    obj.Bar = "baaaaaaaar";
}
Run Code Online (Sandbox Code Playgroud)

我猜:没有,但我被C#和C#编译器以前的工作方式多次欺骗了,所以我现在对我的假设很谨慎,我很高兴得到确认或反驳.

附属问题:

foreach(MyDumyObject obj in MyDumyCollection)
{
    obj.Foo = "fooooooooo";

    // ....

    obj.Foo = "foooooooooooooooooooooooo";
}
Run Code Online (Sandbox Code Playgroud)

相当于

foreach(MyDumyObject obj in MyDumyCollection)
{
    obj.Foo = "fooooooooo";
}

// ....

foreach(MyDumyObject obj in MyDumyCollection)
{
    obj.Foo = "foooooooooooooooooooooooo";
}
Run Code Online (Sandbox Code Playgroud)

Bro*_*ass 10

两个循环比一个循环更昂贵

假设循环语句中的代码比循环开销本身要昂贵得多,那应该没关系 - 但在你的情况下,开销似乎更重要,所以是两个循环更昂贵.对于每个循环,必须生成一个Enumerator,你必须为集合中的每个项目前进到枚举中的下一个项目(即使对于列表,这是一个简单的索引访问[]) - 有两个循环,你有这个开销两次.

还要记住有些枚举,你不能迭代两次,因为迭代时会消耗数据,即从网络接收的数据,但这些情况很远,介于两者之间 - 对于内存中的集合(如List<T>),这通常不会应用.

一般来说,可读性与微优化相比 - 我并不认为循环开销在很多方面都很重要.

  • 这真的取决于.根据我的经验,大多数收藏品都很小,但如果有数百万件物品,那么我宁愿迭代一次而不是两次.此外,我认为单循环*更可读,而不是更少. (3认同)