c 測試篇之Linq效能測試

2021-09-06 08:01:00 字數 4082 閱讀 1203

以下測試結果有誤!!!

linq為延遲執行語句,呼叫結果時,才執行查詢語句。

留文自省!!

.net 3.5之後出現了linq,它包含幾個分類:linq to object, linq to xml, linq to sql, linq to dataset,linq to ado.net。本篇說說linq to object的部分用法的效能測試。

首先,用linq實現修改集合中的每個元素。

list *** = new list() ;

var linq = ***.select(x => "

000" + x);

值得注意的是,select返回的型別是ienumerable的,可就是可列舉型別。它的優勢在於多個linq語句一起執行時,只會歷遍一次(盡量少的次數)來獲取結果。

如果上面的這段**用基本的c#語句來實現,**應該如下:

var yyy = new list();

foreach (var item in ***) yyy.add("

000" + item);

下面通過**來同時測試兩者的效能。

list *** = new list() ;

system.diagnostics.stopwatch watch = new

system.diagnostics.stopwatch();

system.diagnostics.stopwatch watch2 = new

system.diagnostics.stopwatch();

system.diagnostics.stopwatch watch3 = new

system.diagnostics.stopwatch();

watch.start();

for (int i = 0; i < 100000; i++)

watch.stop();

var usetime = (double

)watch.elapsedmilliseconds;

watch2.start();

for (int i = 0; i < 100000; i++)

watch2.stop();

var usetime2 = (double

)watch2.elapsedmilliseconds;

watch3.start();

for (int i = 0; i < 100000; i++)

watch3.stop();

var usetime3 = (double)watch3.elapsedmilliseconds;

用十萬次的迴圈來測試消耗的時間。測試物件包括:

純linq語句的修改,返回ienumerable;linq語句修改 + tolist(),最後返回list;foreach歷遍修改,返回list。執行這段**,檢視usetime的結果。執行一次的結果如下:

usetime = 11.0

usetime2 = 87.0

usetime3 = 73.0

由這個結果可以得出:linq修改的速度最快,其次是foreach歷遍,linq+tolist最慢。在平時的使用過程中,如果返回的結果不是必須轉換成list集合的情況下,用linq可以更快更節省**!不熟悉ienumerable介面的可以深入了解一下,它是可列舉型別,可以用foreach來歷遍,list和array都繼承了這個介面。

linq的另乙個很明顯的優勢是,它可以多個函式命令累積執行。形如linq.select().where().groupby().select();這樣的**無疑更精簡。以下同樣通過**來測試這樣的linq效率如何。

實現的目標:在修改的同時查詢過濾,同時用linq和foreach歷遍實現。

list *** = new list() ;

system.diagnostics.stopwatch watch = new

system.diagnostics.stopwatch();

watch.start();

for (int i = 0; i < 100000; i++)

watch.stop();

var usetime = (double

)watch.elapsedmilliseconds;

system.diagnostics.stopwatch watch2 = new

system.diagnostics.stopwatch();

watch2.start();

for (int i = 0; i < 100000; i++)

}watch2.stop();

var usetime2 = (double)watch2.elapsedmilliseconds;

執行的結果:usetime = 18.0; usetime2 = 379.0 效率差距出來了。

在只有單個命令的前提下,linq和foreach執行的效率相差只有幾倍,多個命令時,linq的效率就明顯比foreach快很多了。

補充:在linq語句的後面加上tolist()來執行linq語句。最終結果:usetime = 404.0; usetime2 = 333.0. 

補充測試:select+groupby+selectvsforeach

liststring, string>> *** = new liststring, string>>() ;

system.diagnostics.stopwatch watch = new

system.diagnostics.stopwatch();

watch.start();

list

res = new list();

for (int i = 0; i < 100000; i++)

) .groupby(x =>x.key)

.select(x => x.key + "

:" + x.select(y => y.value).aggregate((y, z) => y + "

_" +z));

res.addrange(linq);

}watch.stop();

var usetime = (double

)watch.elapsedmilliseconds;

system.diagnostics.stopwatch watch2 = new

system.diagnostics.stopwatch();

watch2.start();

for (int i = 0; i < 100000; i++)

foreach (var x in

dic)

res.add(x.key + "

:" + (string.isnullorwhitespace(x.value) ? "" : x.value.remove(0, 1

)));

}watch2.stop();

var usetime2 = (double)watch2.elapsedmilliseconds;

除錯得到結果:usetime = 422.0; usetime2 = 228.0。結合上面的除錯結果,

linq的執行效率基本上都要比用基礎**編寫的foreach要慢一點。

補充二:其他人的說法。沒有測試過。asparallel()這個方法值得深究。

「要真正比較linq的好處,不能用這麼簡單的**的。你嘗試一下

int result=list.asparallel().where(i=>i%3==0).select(i=>i*i).toarray();

然後用for迴圈和lambda同樣實現乙個多執行緒的求解,你就知道linq的威力了。

一般來說,如果你自己排程的不好,效能肯定比linq差。但是如果你排程的好,你會發現「我寫了這麼多**,只比linq快了那麼一點點,但是linq只有一行」,所以最終你會選擇linq。」

Linq 效能測試

linq 提供了一種在記憶體中運算元據的高效方式,寫了乙個測試 比較生成同等xml 的時間開銷.構建基礎類 提供原始xml 操作 和 基於 linq 的xml 操作 using system using system.io using system.linq using system.reflect...

效能測試之效能優化篇

系統上線必會經歷測試階段,功能測試我們可以按照產品的設計原型去執行一條條測試用例來覆蓋產品功能點。但是在功能測試之外,如果乙個使用者介面層服務,我們還需要知道服務的效能指標以了解並評估這個服務在實際的生產環境中可以應對多大壓力,我們可以根據這個資料情況根據不用的場景時間去對應的增加機器節點或進行重構...

效能測試之Web篇

piaocl 關鍵字 效能測試,web測試 摘要 隨著網路世界的迅猛發展,的效能變得日益重要,效能不好的 將被使用者所拋棄。所以效能是使用者對軟體系統是否滿意的乙個重要方面。本文將對什麼是效能,如何測試效能等方面進行論述。那麼效能是什麼呢,效能是特定功能占用的時間和資源。他可以是功能的開銷或者是同步...