當看過的程式多了,有時候看到不一樣的寫法或多或少都會想比較一下哪個比較快一點。
一般想要測試差異,大多會用個迴圈包著執行某個 method,用 Stopwatch 來紀錄執行的時間。
但這樣測試其實滿容易被質疑的,像是第一次執行呼叫 method 會有 JIT 的成本,
曾經把兩個方法的位置對調,將另一個要比較的方法先做,出來的結果與前一次相反,這讓我呆滯了一會。
後來就比較少做這種事了,直接上網找別人實驗的結果.
直到最近從 udemy 的一個課程,它介紹了 BenchmarkDotNet 用來進行評估的套件。
它能夠在不同的runtime都能支援,也能比較新舊JIT, 看了一下真的覺得滿酷的。
所以寫了這篇紀錄一下。
以下為 mac .net core 2.2 環境
首先先在專案目錄加入BenchmarkDotNet package
dotnet add package BenchmarkDotNet
之後在想要評估的 method 上面加上 [Benchmark] attribute
using System.Linq;
using BenchmarkDotNet.Attributes;
namespace Measure
{
public class Test
{
private string[] data;
[GlobalSetup]
public void Setup()
{
data = new []{ "102", "05" };
}
[Benchmark]
public bool IndexOf()
{
return data.Any( n => ";01;05;09;".IndexOf(";" + n + ";") > -1);
}
}
}
之後程式執行的入口點加上 BenchmarkRunner.Run<Measure.Test>()
using System;
using BenchmarkDotNet.Running;
namespace benchmarkTest
{
class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<Measure.Test>();
}
}
}
最後執行程式
dotnet run -c release
最終會產生出這樣的畫面

除了執行時間也可以評估記憶體 只要在類別上加上 [Memorydiagnoser]
結果如下

我覺得能夠得到這樣資訊很棒,除了快慢之外,在程式裡也可以看看分配的記憶體大小。
畢竟 碰上 GC 也會讓程式變慢,這樣我就有證據叫別人改程式了。
更多的設定或方式可以上 BenchmarkDotNet 網站上查詢,
上面還滿多 Sample 可以看的。