事由:
這兩天mentor給我布置了個任務讓我用BenchmarkDotNet工具去測試一下同一個API 用同步和異步方法寫性能上有什么差別。
順帶提一下:
啊啊啊啊 等我仔細看文檔的時候文檔 發現它讓我用Release的模式去運行benchmark。 emmm...其實我之前一直在用Debug模式調試。。
所以各位在運行的時候,The best way is build our benchmark in the Release mode and run it from the command line.
過程:
首先 我們需要在Nuget上安裝BenchMarkDotNet
(安裝當前最新版本,當前我已經安裝好了)
但是卻安裝失敗出現兩個error。
其中一個是
第二個
ok,第二個錯誤非常顯眼,那我先嘗試着按照它的說法解決 我邊在Nuget上找到 Microsoft.CodeAnalysis.CSharp 2.8.2 ,Microsoft.CodeAnalysis.Common (= 2.8.2) 我安裝的都是2.8.2的版本 但是其實這兩個包都有更新的版本。安裝完畢后 發現錯誤消失了,卻跳出幾個警告。(對后面的測試沒有影響就先不搭理)
安裝完,上述兩個包后 再回去安裝 BenchmarkDotNet 終於安裝成功了。
Ok此時我們在新建一個Console.App ,命名為BenchMarkDotNetTest
在API層把需要的方法 前加上[Benchmark] 引用BenchmarkDotNet.Attributes;
注意:原來的方法中是有參數的,但是這里不允許有參數,我就把方法的入參和值直接寫到方法里面去了。
這2個方法都在UserImpelement 類中所以我們在Main方法中這樣寫
static void Main(string[] args) { var summary = BenchmarkRunner.Run<UserImpelement>();
//var summary = BenchmarkRunner.Run(typeof(UserImpelement))//當然也可以這么寫 Console.WriteLine("-----------------"); Console.WriteLine(summary); Console.ReadKey(); }
點擊運行,emmm,錯誤又來了
在百度上搜索了,但是未能找到結果,於是就去Bing上搜索
GitHub上有回復
https://github.com/dotnet/BenchmarkDotNet/issues/579
(當然官方文檔也有回答)
Ok 根據解決方案 我們新創建了AllowNonOptimazed類
運行的summary改成
var summary = BenchmarkRunner.Run<UserImpelement>(new AllowNonOptimized());
再次運行,運行開始。 運行需要一點時間
可以看到運行大概花費了1分52秒
總結果如下
我運行了多次每一次的數據都有變化,響應速度上也是有時CheckLogin快 有時AsyncCheckLogin更快些
我們還能在BenchMarkDotNetTest\bin\Debug\netcoreapp2.1\BenchmarkDotNet.Artifacts\results中看到輸出結果的XLS ,MD和HTML文件
當前截圖是我運行了2次的結果所以有兩張XSL表格
點開HTML文件可以看到也是一樣就是本次性能測試的Summary
而打開表格的時候則會有更多詳細的性能數據顯示
可是我對這些性能指標很陌生,至少我們初步的看一下他們代表什么有什么意義
// * Legends *
Mean : Arithmetic mean of all measurements
Error : Half of 99.9% confidence interval
StdDev : Standard deviation of all measurements
1 ms : 1 Millisecond (0.001 sec)
Mean: 可以反映響應時長
StdDev:事務處理響應的偏差,值越大,偏差越大;
Median:中值響應時間
confidence interval:置信區間 (展現這個參數的真實值有一定概率落在測量結果的周圍的程度)
補充:
話說,我同樣的情況下運行4次,只有1次出現了中值 其他三次都沒有。
后來發現其實在類前加上 [
從每一次的運行測試結果上看也是五五開- - 我想會不會是當前接口邏輯太簡單了呢所以很難得出結果,那ok我們再來多測試幾個接口
(這次我換了另一個.Net Core API項目)
那我們對三組方法進行測試(同樣的方法內容用同步和異步處理)
分別為
login(登錄)
ReturnClient(返回管理員用戶信息)
loadImg(加載頭像信息)
按照同樣的步驟進行操作,運行
這個項目進行測試這一次測試耗時非常短(39秒)
上述結果而言 其實同步的響應時間通常快於異步(當然其實我不是特別確信我的判斷)
ok進行第二組測試
第三組
第四組
emmm...果然還是有波動的。
所以我測試了很多組數據,但是想去比較個究竟,卻感覺自己似乎進入了誤區了。
我現在剛剛大四,技術不是非常好,還是希望各位大牛提提意見。
這些性能指標具體代表些什么,又如何去反應代碼的性能優劣呢?
還有我這樣去比較同步和異步的方法性能是否正確呢 ,為什么我看不出個所以然呢?
補充:
BenchmarkDotNet官方文檔 https://benchmarkdotnet.org/articles/guides/getting-started.html