Entity Framework在x64上启动比在x86上慢得多

21

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

在将他的代码移动到一个单独的解决方案中以尽可能地隔离它后,我发现包含项目的平台目标对EF启动过程的运行时有重大影响。

当以x64为目标时,我发现测试需要 ~7秒来启动第一个DbContext,而启动第二个DbContext只需要<1秒(与我的同事的发现一致,他也以x64为目标)。然而,当我将平台目标切换为x86时,第一个DbContext的启动时间缩短了约4秒,降至3.34633秒,而第二个DbContext所需的时间与x64情况相同。

鉴于此,似乎Entity Framework在针对64位系统和32位系统时正在经历完全不同的初始化过程。有人能解释一下幕后发生了什么吗?


这可能是汇编探测吗?您可以查看Fusion日志进行快速检查。 - Craig Stuntz
@CraigStuntz 我检查了融合日志,没有看到在x86和x64中出现不同的内容。 - Sidawy
1
这很有趣。FYI,EF没有任何特定于32位或64位架构的代码 - 它是纯IL。尽管如此,差异还是很大的。 - Pawel
你的同事说项目中文件数量似乎也会影响性能。这可能是因为EF使用反射来扫描程序集,这就是需要时间的原因。EF上下文是如何定义的?它使用.edmx文件还是Code First?如果是Code First,你是否使用流畅API来映射实体或属性?这也可能是32位更快的原因,因为32位程序集更小,需要扫描的代码更少。 - Erik Funkenbusch
@MystereMan,它正在使用带有fluent api的code first。我已经在我们的主要解决方案中运行了测试,并在一个仅包含该文件的解决方案中运行了测试,其运行时间相当。因此,解决方案/项目大小似乎没有影响。 - Sidawy
显示剩余3条评论
1个回答

11
问题是完全可以再现的。我刚刚运行了它并使用 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表现出相同的行为。


2
你知道他们说什么吗……“双倍的位数,双倍的乐趣!”哦等等,那不对。 - BoltClock
1
非常有趣。我运行了相同的跟踪集并看到了相同的行为。这引出了一个问题,为什么Nunit运行程序和EF之间的交互会导致x64中运行时间增加。 - Sidawy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接