【问题标题】:Is Linq faster than a foreach and how to replace the loop with it?Linq 比 foreach 快吗?如何用它替换循环?
【发布时间】:2020-01-31 02:22:15
【问题描述】:

我想彻底删除 foreach。

这是我的代码

foreach (var user in elite.Users)
{
    if (user.UserName==txtuser.Text && user.UserPWD==txtpass.Text)
    {                    
        MainForm mainForm = new MainForm();
        mainForm.ShowDialog();
        Hide();
        Close();
    }
}

【问题讨论】:

  • 当您创建和显示对话框时,我认为 foreach 的任何潜在开销都不是问题。你能帮助我们理解你从哪里得到的 foreach 非常慢的想法吗?你有这方面的任何文档,或者有任何演示它的代码吗?我问是因为我经常使用 foreach 并且它对我来说并不慢。此外,如果 LINQ 正在做任何表现得像循环的事情,那意味着那里有一个实际的循环,在你正在调用的某些方法中。
  • 为什么你认为 LINQ 表达式会比 foreach 更快?你认为它们是如何实施的?此外,LINQ 用于查询(这是Q 的意思),而不是像这样的副作用。
  • 不要为每个用户使用一个新的但相同的表单,而是考虑为每个用户重用一个表单实例
  • 我在从数据库中检索数据后使用 linq 表达式进行了一些计算,它比 for 循环快了大约 10 倍。
  • for is faster than foreach is faster than LINQ for LINQ to Objects。对于 LINQ to EF / EF Core / SQL,LINQ 可能比foreach 更快,具体取决于查询的性质以及数据库服务器的类型和速度,因为查询要么在数据库端(EF/EF Core 3/SQL)或在数据库服务器和客户端之间拆分(EF Core foreach 慢。

标签: c# linq loops optimization


【解决方案1】:

Linq 不一定更快:这是一个神话

Linq 使用了很多占用大量 CPU 周期的方法调用...

当然,Linq 已经过优化,可以在几次调用中大获成功,有时甚至比内部人员编写的代码还要快。

但根据您所操作的对象类型,Linq 需要大量资源,有时会更慢。

向 Linq 提出的问题首先是关于代码的质量、简洁性、健壮性和可维护性,这是一个奇迹

对于您的代码,您不需要 Linq,它也不会运行得更快。

您可以在if 范围的末尾添加一个中断,以便在找到用户后停止解析:

foreach (var user in elite.Users)
  if ( user.UserName == txtuser.Text && user.UserPWD == txtpass.Text )
  {                    
      MainForm mainForm = new MainForm();
      mainForm.ShowDialog();
      Hide();
      Close();
      break;
  }

使用 Linq,您可以编写:

if ( elite.Users.Any(user => user.UserName == txtuser.Text 
                          && user.UserPWD == txtpass.Text) )
{
  MainForm mainForm = new MainForm();
  mainForm.ShowDialog();
  Hide();
  Close();
}

如您所见,代码本身没有任何好处,而且在这么简单的事情上执行速度不会更快,也不会更慢。

因为,Linq 是什么?它以某种方式执行 foreach...

https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,e73922753675387a,references

https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8087366974af11d2

【讨论】:

  • 循环需要 1300 毫秒(表格只有一行),我认为这里很慢,因为使用了实体框架 6.3。
  • EF 速度慢但效率高。
  • 可以使用 Any() 代替 Where()
【解决方案2】:

在底层,Linq 或 Language Integrated Query (几乎)与执行 foreach 相同。

LINQ 并不快,而且可以说比 foreach 慢。它被大量使用,因为它可以简化和缩短代码。

如果您想提高迭代的性能,请考虑在可能的情况下添加 breakcontinue 语句。

您还可以通过使用多线程的 TLP (Task Parallel Library) 或 PLINQ (Parallel LINQ) 加快迭代速度。

在某些(我什至会说大多数)情况下,使用多线程可能比执行同步迭代要慢。它还会导致您的代码更加复杂,如果不理解,它通常是应用程序中许多错误的根源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 2011-03-10
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2019-04-04
    • 2018-08-20
    • 2020-06-08
    相关资源
    最近更新 更多