今天,我們將研究如何使用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