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

时间:2011-03-16 15:15:23

标签: c# .net optimization refactoring

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

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

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

假设我还有一个名为MyDumyObject

MyDumyCollection集合

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

相当于

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

foreach(MyDumyObject obj in MyDumyCollection)
{
    obj.Bar = "baaaaaaaar";
}

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

附属问题:

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

    // ....

    obj.Foo = "foooooooooooooooooooooooo";
}

相当于

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

// ....

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

3 个答案:

答案 0 :(得分:10)

  

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

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

另外请记住,有些枚举不能迭代两次,因为迭代时会消耗数据,即从网络接收的数据,但这些情况介于两者之间 - 对于内存中的集合(如{{ 1}})这通常不适用。

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

答案 1 :(得分:1)

你也可以问一个循环是否有任何开销。它可能没有太大的开销,但如果它有任何开销,那么两个循环会有更多。

答案 2 :(得分:1)

关于你的附属问题,它实际上归结为省略号中发生的事情。如果你在你设置它的点之间引用了obj.Foo的值 - 或者在YourDummyCollection中的任何obj的Foo,那么双循环场景可能会产生不同的结果。比方说,例如,你在循环中有一个调用再次循环集合,添加所有Foos的长度。最后一次通过循环,它将拥有所有“foooooooooooooooooooooooo”除了一个 - 但如果你将第二个赋值分离到它自己的循环中,它将全部是“fooooooooo”。完全不同。