今天,我們將研究如何使用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
接下來,我們添加NuGet包 BenchmarkDotNet
然后,修改 program.cs文件中,把可訪問性改成 public
現在我們可以創建一些測試方法,我們直接修改program.cs, 每個測試方法都需要 [Benchmark]
特性,我創建了三個示例,分別使用+運算符,Linq的Concat函數和使用StringBuilder拼接。
最后,在控制台應用程序的Main入口點中,添加 BenchmarkRunning Run命令:
然后我們使用下邊的命令運行測試,或者直接使用VS啟動項目,需要切換到Release模式下
dotnet run -p BenchmarkTesting.app.csproj -c Release
運行大約需要幾分鍾,基准測試工具在后台創建大量線程/作業並多次運行測試,為了獲得一致的結果,建議最小化打開的應用程序,並且在運行時不要執行任何其他操作,輸出如下所示,其中包含很多信息。
單位"us"是"μs"或微秒的縮寫,一微秒等於一毫秒的1/1000。
由此可見,StringBuilder要比+運算符效率更高,Linq Concat函數也相對高效,但還是沒有StringBuilder快。
總結
拼接字符串時使用StringBuilder! 本篇文章只是簡單作的做了介紹,Benchmark.NET是測試性能的非常強大的工具,如果需要構建Nuget包,或者開發通用類庫時,這將是一種很好的測試方法。
原文鏈接: https://samlearnsazure.blog/2021/01/12/measuring-code-performance-with-benchmark-net/
最后
歡迎掃碼關注我們的公眾號 【全球技術精選】,專注國外優秀博客的翻譯和開源項目分享,也可以添加QQ群 897216102
