CYQ.Data數據框架的性能評測
最近有網友經常關注CYQ.Data的性能問題,雖然關注,但沒發現誰主動的寫過和其它框架的性能評測文章。
個人平常比較忙一些,這么長久以來,一直也沒好好的為CYQ.Data寫一個簡單的性能測試。
今天,得為它寫了一篇了。
雜七幾句:
當很多人問我 CYQ.Data 性能怎樣時,我說:比其它ORM的框架性能要好。
當然,我沒有給出任何的測試數據來證明,因為我沒用過其它框架,所以沒法給出數據,所以只能任網友:愛信不信。
說比其它框架要好,當然不是因為賣瓜的贊瓜甜,而是基于以下的認知:
數據框架,正常都由這幾個過程組成:外部表現形式封裝->生成SQL->調用ADO.NET執行。
其中,ADO.NET執行上基本上一個樣的,因此,框架的性能差異也就表現在外部形式的封裝上和生成SQL的過程,性能差異多數取決于封裝的復雜度。
而 CYQ.Data ,僅是在SQLHelper上多包裝了一層,走的是原生的索引形式,所以從封裝及生成SQL上的速度來說,是要比其它NHibernate、Spring.Net、Entity Framework、Linq等來的快些的。
因此,我也就簡略的得出一個簡單但不嚴謹的結論。
說明:
由于沒有使用其它框架的習慣,故此處的評測,就不與其它框架做比較。
而將采用與原生的ADO.NET比較,測試CYQ.Data與原生框架的性能差異有多少。
懂其它框架的人,與原生ADO.NET一比,自然也可以得出和CYQ.Data的性能差異了。
本次測試僅測試寫數據,測試代碼將在后面顯示。
一:寫個循環調用插入數據看看結果先
1:插入10條數據:
2:插入100條數據:
3:插入1000條數據:
分析從上面3張圖的數據中,暫時得出的結論是:
在數據量小的情況,CYQ.Data 的性能竟然比原生ADO.NET的還優越。
隨著數據量往上升時,CYQ.Data 的性能開始下降。
結論疑問:
這個結論讓人看著很迷惑,甚至是不太可能的,有幾個疑點:
- CYQ.Data 數據框架是基于ADO.NET封裝的,怎么可能比ADO.NET執行的更快?
- CYQ.Data 在循環次數增加時,性能就越來越下降?
- CYQ.Data 的MAction表現比MProc差這么遠的?
疑問解答,發現問題:
- CYQ.Data 默認開啟的事務機制,導致比示例中無事務的ADO.NET調用性能高了一些。
- CYQ.Data 內部的DebugInfo屬性,不斷的循環自加記錄執行的SQL語句致性能下降。就是通常人們經常測試的string與StringBuilder的區別。
- MAction內部多了一次反填充,即插入后,根據ID查詢數據填充了下行數據,所以測試對它是不太公平的。
二:公平測試
CYQ.Data:關閉調試信息、關閉事務、MAction關閉反填充。
同時為了避免由于執行順序引起的性能影響,每個我都單獨執行,執行后truncate表再執行另一條。
由于沒有一起執行,就看不到一起輸出的信息截圖了,只能單獨的復制結果下來了。
結果如下:
1:插入10條數據:
ADO.net [ADO.net]:0.15625[秒]--10 |
2:插入100條數據:
ADO.net [ADO.net]:0.203125[秒]--100 CYQ.Data[MProc##]:0.234375[秒]--100 CYQ.Data[MAction]:0.3125[秒]--100 |
3:插入1000條數據:
ADO.net [ADO.net]:0.53125[秒]--1000 CYQ.Data[MProc##]:0.859375[秒]--1000 CYQ.Data[MAction]:1.015625[秒]--1000 |
分析從上面三組數據中,我們看出:
CYQ.Data 的性能基本維持和ADO.NET相差無幾,在數據量上升到時1000時,也僅是2倍不到的差距。
由此說明,CYQ.Data 在性能上,是相當接近原始的ADO.NET,原因就在于,它并沒有過多去封裝ADO.NET。
僅是簡單的封裝,卻能使用如此簡便,這就是它區別其它框架最大的優勢所在。
當然,這僅是一個小的測試,不能代表總體來做嚴謹的解答。
但,在某方面,也算是給對此框架性能有疑問的網友,作了一點解答。
至少,它還是值得你擁有的。
下載地址:http://www.cyqdata.com/download/article-detail-426
三:測試的代碼示例:
1:原始的ADO.NET測試代碼:
- public static void ADO_NET()
- {
- DateTime start = DateTime.Now;
- SqlConnection con = new SqlConnection("server=.;database=abc;uid=sa;pwd=123456");
- SqlCommand com = new SqlCommand();
- com.Connection = con;
- com.CommandText = "insert into Users(UserName,Password) values(@UserName,@Password)";
- con.Open();
- for (int i = 0; i < count; i++)
- {
- com.Parameters.Clear();
- com.Parameters.AddWithValue("@UserName", "U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);
- com.Parameters.AddWithValue("@Password", "P_" + i);
- if (com.ExecuteNonQuery() > -1)
- {
- ok2++;
- }
- }
- con.Close();
- TimeSpan ts = DateTime.Now - start;
- Console.WriteLine("ADO.net [ADO.net]:" + ts.TotalSeconds + "[秒]--" + ok2);
- }
2:CYQ.Data 的MProc測試代碼:
- public static void MProc()
- {
- DateTime start = DateTime.Now;
- MProc proc = new MProc("insert into Users(UserName,Password) values(@UserName,@Password)");
- proc.EndTransation();//關閉事務
- for (int i = 0; i < count; i++)
- {
- proc.Clear();
- proc.Set("@UserName", "U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);
- proc.Set("@Password", "P_" + i);
- if (proc.ExeNonQuery() > -1)
- {
- ok3++;
- }
- }
- proc.Close();
- TimeSpan ts = DateTime.Now - start;
- Console.WriteLine("CYQ.Data[MProc##]:" + ts.TotalSeconds + "[秒]--" + ok3);
- }
3:CYQ.Data 的MAction測試代碼:
- public static void MAction()
- {
- DateTime start = DateTime.Now;
- MAction action = new MAction("Users");
- action.EndTransation();//關閉事務
- for (int i = 0; i < count; i++)
- {
- action.Set("UserName", "U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);
- action.Set("Password", "P_" + i);
- if (action.Insert())
- {
- ok++;
- }
- }
- action.Close();
- TimeSpan ts = DateTime.Now - start;
- Console.WriteLine("CYQ.Data[MAction]:" + ts.TotalSeconds + "[秒]--" + ok);
- }
原文出處:http://www.cnblogs.com/cyq1162/archive/2011/03/08/1977422.html
【編輯推薦】