Linq查询首选项

时间:2010-07-31 08:41:57

标签: c# .net linq comparison performance

了解Linq。 我有以下代码:

(请原谅数据集的可怜大小)

class Program
{
    static void Main(string[] args)
    {
        var employees = new List<Employee>
                            {
                                new Employee
                                    {
                                        Name = "Bill Bailey",
                                        EmployeeCode = 12345,
                                        Department = "Comedy Lab",
                                        DateOfBirth = DateTime.Parse("13/01/1964"),
                                        CurrentEmployee = true
                                    },
                                new Employee
                                    {
                                        Name = "Boris Johnson",
                                        EmployeeCode = 56789,
                                        Department = "Cycling Dept.",
                                        DateOfBirth = DateTime.Parse("19/06/1964"),
                                        CurrentEmployee = true
                                    },
                                new Employee
                                    {
                                        Name = "Bruce Forsyth",
                                        EmployeeCode = 5,
                                        Department = "Comedy Lab",
                                        DateOfBirth = DateTime.Parse("22/03/1928"),
                                        CurrentEmployee = false
                                    },
                                new Employee
                                    {
                                        Name = "Gordon Brown",
                                        EmployeeCode = 666,
                                        Department = "Backbenches",
                                        DateOfBirth = DateTime.Parse("20/02/1951"),
                                        CurrentEmployee = false
                                    },
                                new Employee
                                    {
                                        Name = "Russell Howard",
                                        EmployeeCode = 46576,
                                        Department = "Comedy Lab",
                                        DateOfBirth = DateTime.Parse("23/03/1980"),
                                        CurrentEmployee = false
                                    }
                            };

        Func<Employee, bool> oapCalculator = (employee => employee.DateOfBirth.AddYears(65) < DateTime.Now);

        var oaps1 = employees.Where(oapCalculator);
        var oaps2 = (from employee in employees
                     where oapCalculator(employee)
                     select employee);

        oaps1.ToList().ForEach(employee => Console.WriteLine(employee.Name));
        oaps2.ToList().ForEach(employee => Console.WriteLine(employee.Name));

        Console.ReadLine();
    }

    class Employee
    {
        public string Name { get; set; }
        public int EmployeeCode { get; set; }
        public string Department { get; set; }
        public DateTime DateOfBirth { get; set; }
        public bool CurrentEmployee { get; set; }
    }
}

我有几个问题:

据我所知,两个特色的Linq查询都在做同样的事情(黑魔法可能正在进行中)。

  1. 他们都会被编译成同一个IL吗?
  2. 如果没有,为什么,如果有大量数据,哪个会最有效?
  3. 监控Linq查询效率的最佳方法是什么?性能计时器还是内置的东西?
  4. lambda表达式是首选方法,因为它最简洁吗?
  5. 在担心luddites的lambda部门,是否值得冒险尝试或使用SQL-esque语法?
  6. 由于

3 个答案:

答案 0 :(得分:3)

RE

var oaps1 = employees.Where(oapCalculator);

VS

var oaps2 = (from employee in employees
             where oapCalculator(employee)
             select employee);

轻微之间存在差异,特别是在where oapCalculator(employee)附近。第二个查询映射到:

var oaps2 = employees.Where(employee => oapCalculator(employee));

所以这是一个额外的委托层,并且由于对变量{{1的封闭',会导致捕获类的(小)开销每次迭代都会解除引用。但除此之外他们是一样的。特别是,oapCalculator被轻易删除(根据规范)。

一般情况下,使用任何场景中最清晰的。在这种情况下,如果你经常处理涉及代表或Select s的场景,你会发现使用.Where等更容易使用{strong>但。

答案 1 :(得分:2)

我并不是说这是讽刺,但有时候最好自己尝试一下。沿着这些方向,这里有一些工具,以及我自己的一些经验。

1和2 :反汇编并找出答案! :) http://www.red-gate.com/products/reflector/

3 :了解您的应用。这是任何性能决定问题的答案,除非你正在做算法工作(数学证明,大o)。分析工具内置于VS。

4 :您更喜欢哪个?你的同事怎么样?这听起来像一个统计问题,需要进行调查

5 :与4类似,试试看吧!正如您可能已经经历过的那样,向您的同事传授新技术将教会您尽可能多地教他们。

我发现在教授普通代表/ lambda使用方面,我的成功率约为50%。我确保从我的生产测试代码中提出实际的例子,并展示了等效的命令式代码如何有很多重复。

我尝试与我的团队一起浏览免费的SICP视频(在重构方面真是令人大开眼界),我觉得这很难卖。 LISP对大多数程序员来说不是最有吸引力的语言......

http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/

答案 2 :(得分:0)

两个LINQ查询都是等价的。第二个使用语法糖,编译器在编译之前将其转换为类似于第一个查询的表达式。就首选而言,使用对您和您的团队来说更具可读性的内容。