2012-09-25 81 views
20

我的同事昨天發佈了這個問題:7-second EF startup time even for tiny DbContext實體框架spinup在x64 vs x86上速度要慢得多

在將代碼轉移到單獨的解決方案以儘可能隔離它之後,我發現包含項目的平臺目標對EF啓動過程的運行時間產生了深遠的影響。當我定位到x64時,我發現測試花費了大約7秒鐘來啓動第一個DbContext和1秒鐘啓動第二個DbContext(與我的同事的目標是x64一致)。但是,當我將平臺目標切換到x86時,第一個DbContext加速時間減少了約4秒,降低到3.34633秒,而第二個DbContext花費了與x64情況相同的時間量。

鑑於此,在針對64位系統與32位系統時,Entity Framework似乎正在經歷一個完全不同的初始化過程。有沒有人有任何洞察,以解釋這個問題?

+0

這可能是裝配探測?你可以看看Fusion Log作爲一個快速檢查。 –

+0

@CraigStuntz我檢查了融合日誌,並沒有看到任何在x86和x64中出現的不同。 – Sidawy

+1

這很有趣。 FYI EF沒有針對32位或64位體系結構的任何代碼 - 它是純粹的IL。差別仍然很大。 – Pawel

回答

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

You知道他們說什麼...「雙倍的比特,雙倍的樂趣!」等一下。那是不對的。 – BoltClock

+0

非常有趣。我跑了相同的一組痕跡,並看到相同的行爲。它引發了一個問題,爲什麼Nunit跑步者和EF之間的交互會導致x64的運行時間增加。 – Sidawy