4

我有一个在生产环境中作为服务运行的应用程序,但我们使用简单的 GUI 进行了一些手动测试——其中几乎没有发生任何事情,它只是一个带有用于输入的文本框的包装器。

我最近更改了我的数据库模式并更新了我的映射以匹配,然后 GUI 突然在一个微不足道的情况下工作得非常缓慢。经过一些记录并多次运行后,发现新的瓶颈是这个查询:

public void Refresh()
{
  using (var session = _sessionFactory.OpenSession()) 
  {
      _allFields = session.Query<FieldDefinition>().ToList();
  }
}

重复地,该方法花费了 1:08 分钟(即使数据库中只有大约 300 个 FieldDefinitions)。到这个时候,我已经厌倦了手动重新运行 GUI,所以我编写了一个单元测试来执行完全相同的情况 - 但我无法重现减速。

我的测试调用了 GUI 使用相同输入执行的相同顶级对象。我希望这将在几乎相同的时间内运行。但是,当使用 MSTest 在 Visual Studio 中运行时,相同的查询只用了不到两秒的时间。那是时间的 1/30。它正在做完全相同的工作,只是速度要快得多。

我检查了是否可以使它们运行相同的东西:

  • 两种方法都产生相同数量的 SQL 语句。
  • 它似乎不是由 JITter 引起的(多次运行 GUI 而不重新启动它,同时一遍又一遍的结果)
  • 将其隔离以使其ISessionFactory对每个Refresh都使用全新的没有效果
  • 关闭日志记录(log4net)没有效果

将查询更改为急切加载孩子确实有效……有点:应用修复后,WinForms 应用程序的速度仅与单元测试的速度一样。单元测试的速度没有显着变化(十分之一秒)。

旧查询导致了select n+1问题:但 Winform 和 MSTest 运行中都存在该问题。因此,只有 WinForm 应用程序出现了明显的放缓。

我该如何解释?为什么只有 WinForm 应用程序在 Select N+1 查询期间会遭受巨大的减速?

4

1 回答 1

0

我会说简介它,然后你就会知道。

于 2012-06-22T09:38:07.600 回答