【发布时间】: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 必须在某种程度上循环。我会检查数据库查询...