【问题标题】:which is more efficient in conditional looping?哪个在条件循环中更有效?
【发布时间】:2015-01-24 07:43:25
【问题描述】:

假设我有以下收藏

IEnumerable<car> cars = new IEnumerable<car>();

现在我需要循环这个集合。

我需要根据车型做一些功能;所以我可以采用以下方法之一:
方法 A:

       foreach( var item in cars){
           if(item.color == white){
              doSomething();
           }
           else{
              doSomeOtherThing();
           }

       }

或其他方式:
方法 B:

foreach( var item in cars.where(c=>c.color==white)){
   doSomething();
}

foreach( var item in cars.where(c=>c.color!=white)){
  doSomeOtherthing();
}

对我来说,我认为方法 A 更好。我只在集合上循环一次 而方法 B 似乎很诱人。框架将为您循环和过滤集合。

那么哪种方法更好更快?

【问题讨论】:

  • 这可能是过早优化的情况,但第一个循环通常更快,虽然不是因为它只循环一次——它会更快,因为它不分配任何内存并避免额外的功能来电。 (第二个版本必须为两个 lambdas 和可能的两个枚举器分配内存,加上为每个项目调用一次 lambda 函数。)更快的方法是让您的数据已经分成两组并在每个组上执行两个紧密循环。如果做不到这一点,让它们按颜色排序也会有所帮助,因为分支预测器可以做得很好。
  • 顺便说一句,名字/头像组合很棒:-)
  • 您是否认为 LINQ 扩展没有进行比较?
  • Ed S. 我想知道使用 linq 过滤是否比使用 if-else 更快

标签: c# collections foreach


【解决方案1】:

方法A比方法B更具可读性。只有一个问题,是car.color还是item.color?

【讨论】:

    【解决方案2】:

    嗯,这取决于过滤过程的复杂程度它可能非常高效,以至于无关紧要,尤其是考虑到您不再需要进行 拥有使用if 语句进行过滤。

    我要说一件事:除非您的收藏大量,否则它可能不会产生足够的影响。而且,有时,优化可读性而不是速度会更好:-)

    但是,如果您真的想知道,您测量!使用合适的类似生产的测试数据为您的环境中的操作计时。只有这样才能确定。

    【讨论】:

    • 然而,要直接回答这个问题,我无法想象在任何情况下 B 与 A 相同或更高效。
    • @EdS.,可能不是,但也许它们像 DBMS 表一样按颜色索引,或者保存在白色和非白色哈希桶中:-) 不太可能,但我的建议仍然有效:测量,不要猜。
    • 哈哈,是的,我就是这么想的。
    • 如果它是 AsParallel,则 LINQ 查询在多核系统上应该更快。但再一次,这仍然取决于数据,他必须衡量。但我很容易想到 LINQ 查询可以更快的情况。
    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 2017-03-11
    • 2020-10-12
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2016-11-20
    • 2021-04-13
    相关资源
    最近更新 更多