gpt4 book ai didi

c# - 为什么相同的 NHibernate 查询在 WinForm 项目中的运行速度比 MSTest 单元测试慢一个数量级?

转载 作者:行者123 更新时间:2023-11-30 13:03:55 26 4
gpt4 key购买 nike

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

我最近更改了我的数据库模式并更新了我的映射以匹配,然后 GUI 在一个小案例上突然变得非常缓慢。经过一些记录并多次运行后,发现新的瓶颈是这个查询:

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

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

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

我检查过的东西是否能让它们运行相同:

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

将查询更改为预加载子项确实工作...有点:应用修复后,WinForms 应用程序的速度仅与单元测试一样快已经 em>。单元测试的速度没有显着变化(十分之一秒)。

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

我该如何解释呢? 为什么只有 WinForm 应用会在 Select N+1 查询期间出现大幅减速?

最佳答案

我会说剖析它,然后你就会知道。

关于c# - 为什么相同的 NHibernate 查询在 WinForm 项目中的运行速度比 MSTest 单元测试慢一个数量级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11146341/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com