天天看點

使用 Benchmark.NET 測試代碼性能

今天,我們将研究如何使用Benchmark.Net來測試代碼性能。借助基準測試,我們可以建立基準來驗證所做的更改是否按預期工作并且不會導緻性能下降。

并非每個項目都需要進行基準測試,但是如果您正在開發的是NuGet程式包或通用dll,則很有意義。

使用 Benchmark.NET 測試代碼性能
并非每個項目都需要進行基準測試,但是如果您正在開發的是NuGet程式包或通用dll,則很有意義。我們将使用它來解決一個古老的問題,字元串拼接,比如下面這樣:

string myString = "string1" + "string2" + "string3" + "string4" + "string5";
Console.WriteLine(myString);      

我們很多人都知道建議使用StringBuilder作為替代方法,并且速度要快得多,特别是在您有很多字元串的情況下。

StringBuilder sb = new StringBuilder();
sb.Append("string1");
sb.Append("string2");
sb.Append("string3");
sb.Append("string4");
sb.Append("string5");
Console.WriteLine(sb.ToString());      

Benchmark.NET

首先,我們需要建立一個控制台項目,​

​BenchmarkTesting.App​

使用 Benchmark.NET 測試代碼性能

接下來,我們添加NuGet包 ​

​BenchmarkDotNet​

使用 Benchmark.NET 測試代碼性能

然後,修改 program.cs檔案中,把可通路性改成 public

使用 Benchmark.NET 測試代碼性能

現在我們可以建立一些測試方法,我們直接修改program.cs, 每個測試方法都需要 ​

​[Benchmark]​

​ 特性,我建立了三個示例,分别使用+運算符,Linq的Concat函數和使用StringBuilder拼接。

使用 Benchmark.NET 測試代碼性能

最後,在控制台應用程式的Main入口點中,添加 BenchmarkRunning Run指令:

使用 Benchmark.NET 測試代碼性能

然後我們使用下邊的指令運作測試,或者直接使用VS啟動項目,需要切換到Release模式下

dotnet run -p BenchmarkTesting.app.csproj -c Release      

運作大約需要幾分鐘,基準測試工具在背景建立大量線程/作業并多次運作測試,為了獲得一緻的結果,建議最小化打開的應用程式,并且在運作時不要執行任何其他操作,輸出如下所示,其中包含很多資訊。

使用 Benchmark.NET 測試代碼性能

機關"us"是"μs"或微秒的縮寫,一微秒等于一毫秒的1/1000。

由此可見,StringBuilder要比+運算符效率更高,Linq Concat函數也相對高效,但還是沒有StringBuilder快。

總結

拼接字元串時使用StringBuilder! 本篇文章隻是簡單作的做了介紹,Benchmark.NET是測試性能的非常強大的工具,如果需要建構Nuget包,或者開發通用類庫時,這将是一種很好的測試方法。

繼續閱讀