【问题标题】:Entity Framework spinup much slower on x64 vs x86x64 与 x86 上的实体框架启动要慢得多
【发布时间】:2012-09-17 01:40:11
【问题描述】:

我的同事昨天发布了这个问题:7-second EF startup time even for tiny DbContext

在将他的代码移至单独的解决方案以尽可能隔离后,我发现包含项目的平台目标对 EF 启动过程的运行时产生了深远的影响。

当以 x64 为目标时,我发现测试启动第一个 DbContext 需要大约 7 秒,而启动第二个 DbContext 需要不到 1 秒(与我的同事的发现一致,他也以 x64 为目标)。但是,当我将平台目标切换到 x86 时,第一个 DbContext 启动时间减少了大约 4 秒,降至 3.34633 秒,而第二个 DbContext 所用的时间与 x64 情况相同。

鉴于此,在针对 64 位系统和 32 位系统时,Entity Framework 似乎正在经历一个截然不同的初始化过程。有没有人知道背后发生了什么来解释这一点?

【问题讨论】:

  • 可能是装配探测吗?您可以查看 Fusion Log 作为快速检查。
  • @CraigStuntz 我检查了融合日志,并没有发现 x86 和 x64 中出现的任何不同。
  • 这很有趣。仅供参考,EF 没有任何特定于 32 位或 64 位架构的代码 - 它是纯 IL。差别还是很大的。
  • 您的同事说项目中的文件数量似乎也会影响性能。可能是 EF 正在使用反射来扫描程序集,这需要时间。 EF 上下文是如何定义的?是否使用 .edmx 文件?还是先码字?如果代码优先,您是否使用流利的 api 来映射实体或属性?这也可能是 32 位更快的原因,因为 32 位程序集更小,需要扫描的代码更少。
  • @MystereMan 它首先使用带有流利 API 的代码。我在我们的主要解决方案中运行测试,并且在它是唯一文件且运行时间相同的解决方案中运行。所以看起来解决方案/项目大小没有影响。

标签: c# performance entity-framework x86 64-bit


【解决方案1】:

这个问题是完全可重现的。我刚刚运行它并使用 dotTrace 性能分析器收集 x86 和 x64 执行的快照。我得到的时间和你报告的差不多。但是 x64 和 x86 跟踪之间确实没有明显的区别—​​—除了 x64 在任何地方都需要至少两倍于 x86 的时间。

但那是对 NUnit 测试运行的跟踪。通过像控制台应用程序一样运行相同的测试,我得到这样的时间:

x86: 0,6864012, 0,0468001
x64: 1,0608019, 0,0468001

看起来好多了,不是吗? x86 和 x64 之间仍然存在差异,但是对于某些操作,x64 代码通常会更慢。

此时的问题不在于 EF,而在于 NUnit 及其测试运行程序。

编辑:

我做了更多的测试。 NUnit 和 Resharper 的任务运行器都有这个问题,但它只影响第一次测试。所有其他测试都运行得很快。 xUnit 显示相同的行为。

【讨论】:

  • 你知道他们在说什么...“双倍位,双倍乐趣!”等一下。这是不对的。
  • 非常有趣。我运行了相同的跟踪集并看到了相同的行为。它引出了一个问题,为什么 Nunit 运行器和 EF 之间的交互会导致 x64 中的运行时间增加。
猜你喜欢
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多