1. 程式人生 > >利用BenchmarkDotNet 測試 .Net Core API 同步和異步方法性能

利用BenchmarkDotNet 測試 .Net Core API 同步和異步方法性能

ons 偏差 microsoft 指標 att 結果 ror 返回 嘗試

事由:

這兩天mentor給我布置了個任務讓我用BenchmarkDotNet工具去測試一下同一個API 用同步和異步方法寫性能上有什麽差別。

過程:

首先 我們需要在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<UsersController>();
            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());

再次運行,運行開始。 運行需要一點時間

可以看到運行大概花費了152

技術分享圖片

總結果如下

技術分享圖片

我運行了多次每一次的數據都有變化,響應速度上也是有時CheckLogin快 有時AsyncCheckLogin更快些

我們還能在BenchMarkDotNetTest\bin\Debug\netcoreapp2.1\BenchmarkDotNet.Artifacts\results中看到輸出結果的XLS MDHTML文件

技術分享圖片

當前截圖是我運行了2次的結果所以有兩張EXL表格

點開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 測試 .Net Core API 同步和異步方法性能