Lambda表达式比foreach语句慢?

时间:2011-03-23 09:11:41

标签: asp.net linq

我做了一个小实验来测试lamdba表达式是否可以检索比foreach语句更快的结果。但是,Lambda失败了

System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();
        st.Start();
        List<int> lst = new List<int>();
        foreach (GridViewRow item in GridView1.Rows)
        {
            if (((CheckBox)item.FindControl("Check")).Checked)
            {
                lst.Add(Convert.ToInt32(((Label)item.FindControl("Id")).Text));
            }
        }
        st.Stop();
        Response.Write(st.Elapsed.ToString());
        Response.Write("<br/><br/><br/>");
        st.Reset();
        st.Start();
        List<int> lstRank = GridView1.Rows.OfType<GridViewRow>().Where(s => ((CheckBox)s.FindControl("Check")).Checked)
                                                                     .Select(s => Convert.ToInt32(((Label)s.FindControl("Id")).Text)).ToList();
        st.Stop();
        Response.Write(st.Elapsed.ToString());
        int i = 0;


output
00:00:00.0000249


00:00:00.0002464 

为什么lambda比foreach慢。这可能是lambda表达式的缺点

3 个答案:

答案 0 :(得分:3)

从技术上讲,你的两种方法并不相同。存在一些差异,例如使用“OfType”在继续之前过滤集合。您最好使用“Cast<GridViewRow>()”,因为您知道每个元素都是GridViewRow类型。

另外,你真的需要Linq语句末尾ToList()的费用,因为你的linq查询现在可以迭代并执行而不必转换回列表吗?

答案 1 :(得分:2)

lambda表达式的开销很小,因为它们在运行时被“编译”。我认为这就是你在“基准”中所看到的。 for each ...是一个完整编译的语句。

您可以预编译lambda表达式。看here。也许您想重新编写代码并再次测试。

答案 2 :(得分:2)

我不会谈论代码的正确性,但我想有机会解释一般规则 在软件开发中,性能损失与缩减水平成反比。 在这种情况下非常正常,foreach比LINQ更快(这更抽象)。 如果你将它与经典的(for(int i:i ++ l,等等))进行比较,它将比foreach更快。 访问一个对象,认为接口较慢,然后访问具体对象:接口已经是一个非常小的抽象级别。 您编写的代码与“机器语言”的“接近”速度一样快,但当然它的可读性和可维护性较差。 问题是如何为我们正在开发的内容找到合适的抽象级别,密切关注性能和代码可读性。

您不需要MVC模式来制作一个在Repeater上显示表格的单页网站: - )