【问题标题】:Which is quickest, Loop or FirstOrDefault()哪个最快,Loop 或 FirstOrDefault()
【发布时间】:2015-04-20 14:05:08
【问题描述】:

我正在尝试提高 WPF 应用程序的性能,因为我的用户对系统的一部分似乎存在性能问题感到难过。有问题的部分是一个显示登录用户的屏幕。缓慢的部分通过以下方式将它们注销:扫描他们的员工参考并找到他们的子控件并将其从父控件中删除,即注销它们。这目前使用循环。

foreach (var userControl in UsersStackPanel.Children)
{
    if (userControl.Employee.EmpRef == employee.EmpRef)
    {                  
        // plus some DB stuff here
        UsersStackPanel.Children.Remove(userControl);                              
        break;
    }
}

但我有一个替代方案,可以做到这一点,

var LoggedInUser = (UI.Controls.Generic.User)UsersStackPanel.Children
                       .OfType<FrameworkElement>()
                       .FirstOrDefault(e => e.Name == "EmpRef" + employee.EmpRef);
if (LoggedInUser != null)
{
    // some DB stuff here
    UsersStackPanel.Children.Remove(LoggedInUser);

}

我已经使用 Stopwatch 类对两者进行了计时,但结果并没有指出哪个更好,它们都返回 0 毫秒。我想知道数据库部分是否是瓶颈,我只是想从屏幕开始改进那里的东西以及数据库更新。 任何想法表示赞赏。 丹

【问题讨论】:

  • 0 毫秒似乎不太可能......我认为你的测试不太符合标准。
  • 另外,您可能想检查一下:stackoverflow.com/questions/8214055/… 基本上,这意味着 LINQ 版本较慢。我怀疑它会慢得多,但你会在这个特定的应用程序中注意到它。当房间里有一头大象时,您正在研究微优化。
  • 如果您查看FirstOrDefault 的源代码,您会发现它也使用了循环。 referencesource.microsoft.com/#System.Core/System/Linq/…
  • 当然这是数据库部分。除非您在该控件中有数千个孩子,否则循环是无关紧要的。在开始进行优化之前,您需要找出代码的哪一部分实际需要优化 - 分析代码并找出它花费最多时间的地方。
  • Dennis_E 感谢的最有用的链接。我觉得 LINQ 必须在某种程度上循环。我会检查数据库查询...

标签: c# .net wpf foreach


【解决方案1】:

在我看来,您的第二个示例应该更像这样:

UI.Controls.Generic.User LoggedInUser = UsersStackPanel.Children
    .OfType<UI.Controls.Generic.User>()
    .FirstOrDefault(e => e.Employee.EmpRef == employee.EmpRef);
if (LoggedInUser != null)
{
    // some DB stuff here
    UsersStackPanel.Children.Remove(LoggedInUser);
}

但无论如何,除非您在 StackPanel 中有数十万个控件(如果您这样做了,那么您有比这个循环更大的鱼要炸),数据库访问将完全淹没并且在两种循环技术。

您的问题中没有足够的上下文来确定正确的做法是什么,但在保持 UI 响应方面,您最有可能要做的是将数据库访问包装在一个辅助方法,然后将该方法作为等待任务执行,例如await Task.Run(() =&gt; DoSomeDBStuff()); 这将使 UI 线程(可能是执行您发布的代码的线程)在 DB 操作继续进行时继续工作。完成数据库内容后,您的方法将在下一条语句处继续执行,即调用 Remove() 方法。

【讨论】:

  • 太棒了,谢谢彼得,我一定会追求这条线,任何能让用户的生活变得更好的东西,并且我在此过程中学到了一些新东西。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2013-07-28
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多