Thursday, February 10, 2011

[C#] LINQ to SQL 效能測試

前陣子在玩LINQ to SQL,總覺得是個不錯的工具,雖然看起來LINQ已廣為眾高手所使用,但是還是會看到很多人說LINQ的效率不如原本的ADO.NET,下面我簡單的使用LINQ to SQL與SqlDataAdapter做個測試,如有考慮不周之處還請多提出建議。

下面是在一個有近11萬列資料的資料表上做的測試,雖然數量還不算多,不過也不是少到只有幾百列就是,應該還可以參考,第一個測試是直接select出全部資料。

            LINQDemoDataContext DB = new LINQDemoDataContext();
            string queryString = "select * from [dbo].[Country_IP]";
            int start, end;
            DataSet dt = new DataSet();

            Console.WriteLine("LINQ to SQL");

            start = System.Environment.TickCount;
            var Result = (from p in DB.Country_IPs select p).ToList();
            end = System.Environment.TickCount;

            Console.WriteLine("Run Time:" + (end - start));

            Console.WriteLine("SqlDataAdapter");

            start = System.Environment.TickCount;
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(queryString, connection);
                adapter.Fill(dt);
            }
            end = System.Environment.TickCount;

            Console.WriteLine("Run Time:" + (end - start));

            Console.ReadLine();

SqlDataAdapter的queryString我有試過其他方式,或是寫的LINQ產生的查詢語法一樣,但是看不出有差異,所以就用比較短的寫法,在我的電腦上,跑出來的數據是這樣,每次的差距不大,我就沒寫平均值了。


LINQ_Test_01

在Select All的結果上,LINQ to SQL平均約為600ms,SqlDataAdapter約為1200ms,LINQ快了約600ms。


接下來換select Random Row的測試,程式碼差不多我就不重複貼了。在之前的作法都是在Query String裡用ORDER BY NEWID()這方法,LINQ也是類似的作法,但是有點小變化,最後結果不變就是,詳情可以看LINQ to SQL Select Random Row這篇,我直接貼結果。

LINQ_Random_03

LINQ to SQL比SqlDataAdapter慢了約100ms上下。


然後是最簡單的select特定資料的測試。

LINQ_Test_03

這邊就不用特別解釋了吧,結果是LINQ to SQL比SqlDataAdapter慢了約100ms多一點,與上一個測試蠻類似的。


接下來做個常會用到的Paging Select 測試,我同時使用LINQ,SQL2005的ROW_NUMBER()分頁方式,與一般使用TOP/NOT IN的分頁方式來測試,結果如下。

LINQ_Test_04

測試的內容是模擬分頁,先取亂數R,然後讀取第R列後的五列資料,可以見到LINQ to SQL產生出來的SQL語法也是使用ROW_NUMBER() OVER的作法,這是我目前所知分頁的最佳解法了,所以在速度上可以看到因為語法一樣的關係,所以LINQ還是只差了100ms上下,我想這應該是無法避免的吧 ?

而一般的TOP/NOT IN做法在某些情況下(資料量多時),速度就較為低下了,在此例中甚至比LINQ還要慢。


最後來比較一個Order by的測試

LINQ_Test_05

在這邊的結果LINQ to SQL比SqlDataAdapter快上約700ms,差距算是不小。


雖然測試並不完全,但是可以看出如果讀出的資料量大的話,LINQ to SQL的效率會比純用ADO.NET好上不少,而在查詢結果不多的情況下,LINQ to SQL大概只輸ADO.NET約100ms上下,這點時間成本相較於LINQ帶來的方便性與可讀性,我個人是可以接受的。


比較就先到這邊結束,其實還有很多東西能比,不過沒甚麼測試資料去做,我就沒去測了,老實說個人覺得LINQ的好用不止於LINQ to SQL這塊,對於一些物件操作的功能都相當強大;除此之外,LINQ還有蠻多長處,對於撰寫程式的幫助可說不小,絕不只是有些人口中的"LINQ只是給不會寫SQL的人用的"這樣而已。

No comments:

Post a Comment