CYQ.Data資料架構的效能評測

來源:互聯網
上載者:User

最近有網友經常關注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 的效能開始下降。

結論疑問:

這個結論讓人看著很迷惑,甚至是不太可能的,有幾個疑點:

  1. CYQ.Data 資料架構是基於ADO.NET封裝的,怎麼可能比ADO.NET執行的更快?
  2. CYQ.Data 在迴圈次數增加時,效能就越來越下降?
  3. CYQ.Data 的MAction表現比MProc差這麼遠的?

疑問解答,發現問題:

  1. CYQ.Data 預設開啟的事務機制,導致比樣本中無事務的ADO.NET調用效能高了一些。
  2. CYQ.Data 內部的DebugInfo屬性,不斷的迴圈自加記錄執行的SQL語句致效能下降。就是通常人們經常測試的string與StringBuilder的區別。
  3. MAction內部多了一次反填充,即插入後,根據ID查詢資料填充了下行資料,所以測試對它是不太公平的。

二:公平測試

CYQ.Data:關閉調試資訊、關閉事務、MAction關閉反填充。

同時為了避免由於執行順序引起的效能影響,每個我都單獨執行,執行後truncate表再執行另一條。

由於沒有一起執行,就看不到一起輸出的資訊了,只能單獨的複製結果下來了。

結果如下:

1:插入10條資料:

ADO.net [ADO.net]:0.15625[秒]--10
CYQ.Data[MProc##]:0.171875[秒]--10
CYQ.Data[MAction]:0.265625[秒]--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測試代碼:

 
  1. public static void ADO_NET()  
  2. {  
  3.     DateTime start = DateTime.Now;  
  4.     SqlConnection con = new SqlConnection("server=.;database=abc;uid=sa;pwd=123456");  
  5.     SqlCommand com = new SqlCommand();  
  6.     com.Connection = con;  
  7.     com.CommandText = "insert into Users(UserName,Password) values(@UserName,@Password)";  
  8.     con.Open();  
  9.     for (int i = 0; i < count; i++)  
  10.     {  
  11.        com.Parameters.Clear();  
  12.        com.Parameters.AddWithValue("@UserName", "U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);  
  13.        com.Parameters.AddWithValue("@Password", "P_" + i);  
  14.        if (com.ExecuteNonQuery() > -1)  
  15.        {  
  16.           ok2++;  
  17.        }  
  18.     }  
  19.     con.Close();  
  20.     TimeSpan ts = DateTime.Now - start;  
  21.     Console.WriteLine("ADO.net [ADO.net]:" + ts.TotalSeconds + "[秒]--" + ok2);  
  22. }  

2:CYQ.Data 的MProc測試代碼:

 
  1. public static void MProc()  
  2. {  
  3.     DateTime start = DateTime.Now;  
  4.     MProc proc = new MProc("insert into Users(UserName,Password) values(@UserName,@Password)");  
  5.     proc.EndTransation();//關閉事務  
  6.     for (int i = 0; i < count; i++)  
  7.     {  
  8.        proc.Clear();  
  9.        proc.Set("@UserName", "U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);  
  10.        proc.Set("@Password", "P_" + i);  
  11.        if (proc.ExeNonQuery() > -1)  
  12.        {  
  13.            ok3++;  
  14.        }  
  15.     }  
  16.     proc.Close();  
  17.     TimeSpan ts = DateTime.Now - start;  
  18.     Console.WriteLine("CYQ.Data[MProc##]:" + ts.TotalSeconds + "[秒]--" + ok3);  
  19. }  

3:CYQ.Data 的MAction測試代碼:

 
  1. public static void MAction()  
  2. {  
  3.     DateTime start = DateTime.Now;  
  4.     MAction action = new MAction("Users");  
  5.     action.EndTransation();//關閉事務  
  6.     for (int i = 0; i < count; i++)  
  7.     {  
  8.        action.Set("UserName", "U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);  
  9.        action.Set("Password", "P_" + i);  
  10.        if (action.Insert())  
  11.        {  
  12.            ok++;  
  13.        }  
  14.     }  
  15.     action.Close();  
  16.     TimeSpan ts = DateTime.Now - start;  
  17.     Console.WriteLine("CYQ.Data[MAction]:" + ts.TotalSeconds + "[秒]--" + ok);  
  18. }  
  19.    

原文出處:http://www.cnblogs.com/cyq1162/archive/2011/03/08/1977422.html

  1. Mongodb億級資料量的效能測試
  2. MongoDB和MySQL效能測試及其結果分析
  3. 精鍊概括Oracle效能測試
  4. MySQL效能測試大總結
  5. MySQL中MyISAM引擎和Heap引擎執行速度效能測試

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.