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

利用BenchmarkDotNet 測試 .Net Core API 同步和非同步方法效能

事由:

這兩天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上有回覆

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...果然還是有波動的。

所以我測試了很多組資料,但是想去比較個究竟,卻感覺自己似乎進入了誤區了。

我現在剛剛大四,技術不是非常好,還是希望各位大牛提提意見。

這些效能指標具體代表些什麼,又如何去反應程式碼的效能優劣呢?

還有我這樣去比較同步和非同步的方法效能是否正確呢 ,為什麼我看不出個所以然呢?