在x64和x86上,实体框架的旋转速度要慢得多

Sid*_*awy 21 c# performance 64-bit x86 entity-framework

我的同事昨天发布了这个问题:即使对于微小的DbContext,7秒的EF启动时间.

在获取代码并将其移至单独的解决方案以尽可能地隔离它之后,我发现包含项目的平台目标对EF启动过程的运行时有深远的影响.

当针对x64时,我看到测试需要大约7秒来启动第一个DbContext并且<1秒来启动第二个DbContext(与我的同事的调查结果一致,也是针对x64).但是,当我将平台目标切换到x86时,第一个DbContext旋转时间减少了大约4秒,减少到3.34633秒,而第二个DbContext花费了与x64情况相同的时间.

鉴于此,当针对64位系统和32位系统时,实体框架似乎正在经历一个完全不同的初始化过程.有没有人能够深入了解引擎盖下的内容来解释这个问题?

Lad*_*nka 11

这个问题完全可以重现.我刚刚运行它并使用dotTrace Performance Profiler来收集x86和x64执行的快照.我报告的时间大致相同.但是x64和x86跟踪之间确实没有明显区别 - 除了x64至少需要两倍于x86的时间.

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

x86: 0,6864012, 0,0468001
x64: 1,0608019, 0,0468001
Run Code Online (Sandbox Code Playgroud)

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

此时的问题不在于EF,而在于NUnit及其测试运行器.

编辑:

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

  • 你知道他们说了什么......"加倍一点,加倍乐趣!" 等一下.那是不对的. (2认同)