【发布时间】: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