2012-02-21 17 views
2

我一直在使用SubSonic 2達5年之久,並且喜歡它。然而,在過去的六個月裏,我一直在思考移動到SubSonic 3或類似的ORM工具的想法。由於我的公司使用了大量的Telerik工具,我以爲我會嘗試OpenAccess。配置後,我想我會嘗試一個非常基本的任務,用我們的Users表(〜30條記錄)加載一個RadGrid信息。Telerik OpenAccess與SubSonic在簡單的速度測試(不是「哪個更好」)

因此,網格的OnNeedDataSource事件中,我有以下:

var start = System.Environment.TickCount; 
context = new EntitiesModel(); 
rgUsers.DataSource = (from u in context.Users select u); 
var stop = System.Environment.TickCount; 
var elapsed = stop - start; 
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed); 

構建和運行頁面後,它吐出回,它花了1607毫秒。但是,刷新頁面後,它會回到0秒。 (爲什麼?)

然後我把亞音速代碼:

var start = System.Environment.TickCount; 
rgUsers.DataSource = new UserCollection().Load(); 
var stop = System.Environment.TickCount; 
var elapsed = stop - start; 
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed); 

我跑了第一次的代碼和它說,它花了171毫秒。刷新頁面後,它報告花費了60-70毫秒。

所以,我的問題是:爲什麼OA在第一次訪問時需要相當長的時間才能加載,但在每個頁面上加載的時間爲零秒刷新?雖然SubSonic在第一次訪問時速度相當快,但每個頁面刷新需要約65ms?

我很抱歉,如果這是一個「基本」問題,或者我沒有充分測試性能。如果有什麼方法可以改進這種方法,我會非常感謝任何建議。

感謝, 安德魯

回答

4

的OpenAccess有創建的第一次創建一個OpenAcccessContext內部數據庫對象。它基本上計算所有的默認值,創建緩存,初始化其他基礎設施對象等。一旦它被創建,它就被存儲在一個內部靜態字典中(connectionID是關鍵字)。

創建的每個其他上下文都將使用該內部對象,並且根本沒有開銷。這說1600毫秒有點高,你可能會考慮改變映射類型(xml是最佳的,性能明智的)。

優化將確保模型在應用程序啓動處理程序中初始化。下面的代碼應該可以做到。

void Application_Start(object sender, EventArgs e) 
{ 
    var modelInfo = new EntitiesModel().Metadata; 
} 

編輯:作爲一個後續行動,它說0毫秒,這實際上不是查詢執行時間。查詢返回的是稍後執行的IQueryable。你必須調用ToList()才能獲得真實的數據。

+0

謝謝。這就說得通了。我按照你的建議做了,第一個負載下降到了900毫秒。 – ajtatum 2012-02-22 14:13:32

1

的原因可能是,在打開的OpenAccess數據庫需要較長的時間比亞音速。在測量加載時間之前,嘗試執行一個簡單的操作,例如只需打開數據庫即可獲得計數。在SubSonic中也一樣。

context = new EntitiesModel(); 
context.Users.Count(); 
var start = System.Environment.TickCount; 
rgUsers.DataSource = (from u in context.Users select u); 
var stop = System.Environment.TickCount; 
var elapsed = stop - start; 
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed); 

托馬斯

0

不知道這是不是主題,但我在過去幾年一直在使用和貢獻SS2和SS3。 我剛剛完成大修,並向SS2添加了MsAccessProvider,並向SS2和SS3添加了Enum生成器(這些生成器已在項目頁面中提交併生效)。

我也放在一起SS3它允許自動化的數據的選擇性緩存(如通用字典)我自己的緩存框架,從表中的任何唯一索引引用的數據庫。我能夠緩存基於模板的網頁生成查找數據,並通過SS3 LINQ查找將響應時間從大約2分鐘提高到幾分之一秒。 (我還沒有公開發布這個)

我只是不知道在哪裏張貼這些東西,以便獲得SS的用戶的關注。我對提交和解決未決問題的承諾產生了精確的零響應。

+0

我想了解更多信息。 github上的用戶名是什麼,或者我怎樣才能與你聯繫? – ajtatum 2012-03-04 14:33:39

+0

我是6pac。您可以在GitHub SubSonic源代碼中看到提交和評論。 (對不起,延遲 - 節假日一週) – 2012-03-13 13:38:11

+0

博客文章在這裏:http://low-bandwidth.blogspot.com.au/2012/10/automated-foreign-key-list-generation.html – 2012-10-17 12:40:25

相關問題