我做了一个小实验来测试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表达式的缺点
答案 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上显示表格的单页网站: - )