2012-04-18 47 views
3

我使用的BindingSource實體框架,當我打電話EntityContext.SaveChange()需要較長的時間,在第一次調用

EntityContext.SaveChange(); 

它需要更多的時間來執行那麼接下來的時間我添加新對象綁定源,然後調用SaveChanges();方法

編輯2

詳細說明:

在負載形式事件

BindingSource.DataSource = EntityContext.Table; 

添加新按鈕

BindingSource.AddNew(); 
Table m_object= (Table)BindingSource.Current; 
m_object.ID = Guid.NewGuid(); 

其他對象數據被使用綁定控件編輯到其屬性

然後保存按鈕

BindingSource.EndEdit(); 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
EntityContext.SaveChanges(); 
sw.Stop(); 
Console.WriteLine(sw.Elapsed.ToString()); 

如果我重複添加和保存好幾次,我得到下面的輸出:

00:00:01.0788243

00:00:00.0316786

00:00:00.0292763

00:00:00.0298630

00:00:00.1127312

這是值得注意的是,第一添加和保存操作需要將近秒多那麼接下來的時間我添加和保存。

回答

1

這可能是由於很多原因,一種可能的原因是當您執行第一次提交時,數據庫是AutoGrowing。你有你的觀察,你正在執行的代碼和時間的差異的一個例子

編輯:

根據您上面的代碼要創建一個新的項目,如果不存在在數據庫中,是否可能是第二次單擊保存時,您只需執行SQL更快的更新操作? (或者如果EF檢測到沒有變化,則潛在的0次)

+0

我在問題中添加了詳細信息,關於時間上的差異,您是指SaveChanges()調用的調用之間還有多少時間,還有您的意思是** AutoGrowing ** – major 2012-04-18 00:33:16

+1

@major它會是如果您可以量化'您需要更多時間來執行然後再次調用',那麼第一次調用saveChange需要多長時間,第二次調用saveChange需要多少時間? SQL自動增長功能可以即時擴展您的數據庫,以便您可以在其中添加更多內容。這通常由插入語句觸發。看看這裏瞭解autogrow http://www.simple-talk.com/sql/database-administration/sql-server-database-growth-and-autogrowth-settings/ – 2012-04-18 01:18:25

+0

@major也看看我的編輯,很可能第二次點擊保存時,實際上並沒有任何更改要保存,或者它的更新更快。 – 2012-04-18 01:22:22

0

Luke提供的原因,但也不要忘記JIT(即時編譯)編譯。當您運行C#應用程序時,它全部編譯爲MSIL(Microsoft中間語言),並且當您第一次開始調用方法時,JIT必須將它們編譯爲本機代碼並運行優化以適應它所運行的操作系統。這是您第一次進行大規模操作的常見原因,可能會有數秒的延遲,而不是預期的毫秒。

Mono擁有AOT(提前編譯)的可信度,這意味着它會跳過這一步,並在您第一次調用某個方法時避免了額外的時間,但是您在其他地方的表現中犧牲了。

還有一個工具,可以讓你在Windows上本地預編譯C#,但我不記得它叫什麼。

http://en.wikipedia.org/wiki/Just-in-time_compilation

0

另外,不要忘了EF更改跟蹤,可能第一次手術後進行緩存數據。基於MergeOption和您正在執行的操作,EF可能會選擇不調用數據庫。我將使用SQL Profiler運行測試以查看實際調用數據庫的差異。另外,檢查後續調用是否使用相同的數據庫連接。

相關問題