.NET9 實現排序算法(MergeSortTest 和 QuickSortTest)性能測試

.NET 9 平臺下,我們對兩種經典的排序算法 MergeSortTest(歸并排序)和 QuickSortTest(快速排序)進行了性能基準測試(Benchmark),以評估它們在不同數據規模下的執行效率、內存分配及垃圾回收行為。

測試使用了 BenchmarkDotNet 工具,確保結果具有高度可重復性和統計意義。

  • Datadog.Trace.BenchmarkDotNet

🧪 測試環境

  • 運行時(Runtime):.NET 9.0.6 (X64 RyuJIT AVX2)
  • 操作系統:Windows 11 24H2(開發預覽版)
  • SDK 版本:.NET SDK 9.0.301
  • 測試工具:BenchmarkDotNet v0.15.2
  • 測試參數:
    • 數據量 N = 100, 1000, 10000(分別模擬小、中、大數據集)

項目準備

創建項目

使用 .net cli 創建控制臺項目,執行如下命令:

dotnet new console -n SortTest
cd SortTest# 安裝 nuget 包 Datadog.Trace.BenchmarkDotNet
dotnet add package Datadog.Trace.BenchmarkDotNet

控制臺項目 SortTest.csproj 信息如下:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net9.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><PublishAot>true</PublishAot><InvariantGlobalization>true</InvariantGlobalization></PropertyGroup><ItemGroup><PackageReference Include="Datadog.Trace.BenchmarkDotNet" Version="2.61.0" /></ItemGroup></Project>

排序算法實現

  • 歸并排序
// =============================
// 排序算法實現:歸并排序
// =============================namespace SortTest;public class MergeSort
{public static void Sort(int[] array){if (array.Length <= 1) return;int mid = array.Length / 2;int[] left = array[..mid];int[] right = array[mid..];Sort(left);Sort(right);Merge(array, left, right);}private static void Merge(int[] result, int[] left, int[] right){int i = 0, j = 0, k = 0;while (i < left.Length && j < right.Length){if (left[i] <= right[j])result[k++] = left[i++];elseresult[k++] = right[j++];}while (i < left.Length)result[k++] = left[i++];while (j < right.Length)result[k++] = right[j++];}
}
  • 快速排序
// =============================
// 排序算法實現:快速排序
// =============================namespace SortTest;public class QuickSort
{public static void Sort(int[] array, int low, int high){if (low < high){int pivotIndex = Partition(array, low, high);Sort(array, low, pivotIndex - 1);Sort(array, pivotIndex + 1, high);}}private static int Partition(int[] array, int low, int high){int pivot = array[high];int i = low - 1;for (int j = low; j < high; j++){if (array[j] <= pivot){i++;Swap(array, i, j);}}Swap(array, i + 1, high);return i + 1;}private static void Swap(int[] array, int i, int j){if (i != j){int temp = array[i];array[i] = array[j];array[j] = temp;}}
}

添加測試基準

  • Benchmark 測試類
// =============================
// Benchmark 測試類
// =============================using BenchmarkDotNet.Attributes;
using Datadog.Trace.BenchmarkDotNet;namespace SortTest;[DatadogDiagnoser]
[MemoryDiagnoser]
public class SortingBenchmark
{private int[] data = [];[Params(100, 1000, 10000)] // 不同數據規模public int N;[GlobalSetup]public void Setup(){var random = new Random(42); // 固定種子以保證重復性data = Enumerable.Range(0, N).Select(_ => random.Next(0, N)).ToArray();}[Benchmark]public void MergeSortTest(){var copy = (int[])data.Clone();MergeSort.Sort(copy);}[Benchmark]public void QuickSortTest(){var copy = (int[])data.Clone();QuickSort.Sort(copy, 0, copy.Length - 1);}
}

使用基準測試

Program.cs 添加如下代碼:

using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Running;
using Datadog.Trace.BenchmarkDotNet;namespace SortTest;internal class Program
{static void Main(string[] args){Console.WriteLine("Hello, SortingBenchmark!");var config = DefaultConfig.Instance.WithDatadog();BenchmarkRunner.Run<SortingBenchmark>(config);}
}

啟動項目基準測試,使用 pwsh 執行如下命令:

dotnet run -c Release

下面這些文本信息是使用 BenchmarkDotNet 工具對兩種排序算法(MergeSortTestQuickSortTest)進行性能測試后生成的報告。


SortTest.SortingBenchmark-20250705-183953

BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4484/24H2/2024Update/HudsonValley)
Unknown processor
.NET SDK 9.0.301[Host]     : .NET 9.0.6 (9.0.625.26613), X64 AOT AVX2DefaultJob : .NET 9.0.6 (9.0.625.26613), X64 RyuJIT AVX2
Method NMean ErrorStdDevGen0Gen1Allocated
MergeSortTest1004.508 μs0.0857 μs0.1863 μs5.3635-8424 B
QuickSortTest1001.249 μs0.0248 μs0.0331 μs0.2689-424 B
MergeSortTest100079.005 μs1.5793 μs2.1083 μs61.4014-96328 B
QuickSortTest100039.192 μs0.6847 μs0.6404 μs2.5024-4024 B
MergeSortTest100001,073.318 μs20.7670 μs26.2637 μs539.0625128.90631112040 B
QuickSortTest10000600.722 μs7.9013 μs6.5980 μs24.4141-40024 B

以下是關鍵內容的通俗解釋:

📊 測試目標

對兩種排序算法在不同數據量下的性能進行對比分析,包括:

  • 執行時間(Mean)
  • 內存分配(Allocated)
  • 垃圾回收情況(Gen0, Gen1)

測試分別在以下數據規模下運行:

  • N = 100
  • N = 1000
  • N = 10000

🧪 性能對比結果

方法數據量 (N)平均耗時內存分配GC 次數 (Gen0)
MergeSortTest1004.508 μs8424 B5.3635
QuickSortTest1001.249 μs424 B0.2689
MergeSortTest100079.005 μs96328 B61.4014
QuickSortTest100039.192 μs4024 B2.5024
MergeSortTest100001073.318 μs1112040 B539.0625
QuickSortTest10000600.722 μs40024 B24.4141

? 結論:

  • QuickSortTest 的平均耗時和內存占用都明顯低于 MergeSortTest
  • 隨著數據量增加,兩者的差距也越來越大
  • QuickSortTest 在性能和資源消耗方面更優

?? 警告與提示

📌 多峰分布警告(Multimodal Distribution)

  • MergeSortTest 的部分測試結果顯示為多峰分布(mValue = 3.23),說明其運行時間波動較大,可能受外部因素影響。

📌 異常值(Outliers)

  • 報告中指出某些測試存在異常值并已被剔除:
    • MergeSortTest: 移除了 4 個異常值
    • QuickSortTest: 不同數據規模下檢測到多個異常值并移除

📋 統計指標含義簡述

指標名含義解釋
Mean平均執行時間
Error置信區間的一半(99.9% 置信度)
StdDev標準差,反映數據波動程度
Gen0 / Gen1垃圾回收次數(代數0/1)
Allocated單次操作分配的內存大小
Median中位數,排除極端值后的中間值
Min / Max最小值和最大值

🖼? 直方圖(Histogram)

每組測試后都有一個簡單的直方圖,用字符 @ 表示不同時間段內執行次數的分布,幫助可視化執行時間的集中趨勢。


📈 小結

  • QuickSortTest 在所有測試中表現更優
    • 更快的執行速度
    • 更少的內存分配
    • 更低的垃圾回收壓力
  • MergeSortTest 性能較差且波動較大
    • 特別是在大數據量(N=10000)時表現不佳
    • 存在較多異常值,穩定性不如 QuickSort

如果你希望進一步優化 MergeSort 或想了解為何它表現不佳,可以結合代碼邏輯、遞歸深度、內存使用等因素進行深入分析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87676.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RabbitMQ - SpringAMQP及Work模型

一、概述RabbitMQ是一個流行的開源消息代理&#xff0c;支持多種消息傳遞協議。它通常用于實現異步通信、解耦系統組件和分布式任務處理。Spring AMQP是Spring框架下的一個子項目&#xff0c;提供了對RabbitMQ的便捷訪問和操作。本文將詳細介紹RabbitMQ的工作模型&#xff08;W…

微信小程序51~60

1.界面交互-loading提示框 loading提示框用于增加用戶體驗&#xff0c; 對應的API有兩個&#xff1a; wx.showLoading()顯示loading提示框wx.hideLoading()關閉loading提示框 Page({getData () {//顯示loading提示框wx.showLoading({//提示內容不會自動換行&#xff0c;多出來的…

SqueezeBERT:計算機視覺能為自然語言處理在高效神經網絡方面帶來哪些啟示?

摘要 人類每天閱讀和撰寫數千億條消息。得益于大規模數據集、高性能計算系統和更優的神經網絡模型&#xff0c;自然語言處理&#xff08;NLP&#xff09;技術在理解、校對和組織這些消息方面取得了顯著進展。因此&#xff0c;將 NLP 部署于各類應用中&#xff0c;以幫助網頁用…

Springboot開發常見注解一覽

注解用法常用參數Configuration用于標記類為配置類&#xff0c;其中通過Bean方法定義Spring管理的組件。它替代XML配置&#xff0c;用Java代碼聲明對象創建邏輯&#xff0c;并確保單例等容器特性生效。相當于給Spring提供一個“制造說明書”來組裝應用部件RestControllerRestCo…

Maven高級——分模塊設計與開發

目錄 ?編輯 分模塊設計與開發 拆分策略 繼承與聚合 版本鎖定 聚合 作用 實現 Maven中繼承與聚合的聯系與區別&#xff1f; 聯系 區別 私服 分模塊設計與開發 將一個大項目拆分成若干個子模塊&#xff0c;方便項目的管理維護&#xff0c;擴展&#xff0c;也方便模…

線程池的七個參數設計源于對高并發場景下資源管理、系統穩定性與性能平衡的深刻洞察

?? 一、核心參數設計目標與解決的問題 參數設計目標解決的核心問題典型取值策略corePoolSize&#xff08;核心線程數&#xff09;維持常備線程資源避免頻繁創建/銷毀線程的開銷&#xff0c;提高響應速度CPU密集型&#xff1a;N_cpu 1 IO密集型&#xff1a;2 N_cpu maximum…

少樣本學習在計算機視覺中的應用:原理、挑戰與最新突破

在深度學習的黃金時代&#xff0c;大量標注數據似乎成了算法性能的前提。然而在許多現實場景中&#xff0c;如醫療圖像分析、工業缺陷檢測、遙感識別、甚至個性化視覺服務中&#xff0c;高質量、成規模的標注數據往往昂貴、稀缺&#xff0c;甚至難以獲得。這種場景正是**少樣本…

github在線圖床

github做的圖床&#xff0c;原理是利用github API實現的在線上傳&#xff0c;就一個頁面&#xff0c;css和js都是集成在頁面&#xff0c;相關信息保存在瀏覽器緩存中&#xff0c;配置一下即可使用 效果演示&#xff1a; github在線圖床 打開網站填寫下列信息 github用戶名&a…

css-多條記錄,自動換行與自動并行布局及gap兼容

實現這樣的內容布局&#xff0c;當一段文案長度超過當前行的時候自動占據一行&#xff0c;其他相近的不超過一行自動放在一行間隔隔開 關鍵實現原理&#xff1a; 彈性布局容器&#xff1a; .history-container {display: flex;flex-wrap: wrap;gap: 12px; }使用flex-wrap: wr…

Redis 哨兵模式部署--docker版本

redis sentinel 簡介 Redis Sentinel 是 Redis 官方提供的高可用&#xff08;HA&#xff09;解決方案&#xff0c;用于監控主從架構中的故障并自動完成故障轉移。當主節點&#xff08;Master&#xff09;宕機時&#xff0c;Sentinel 能自動選舉新的主節點&#xff0c;通知從節…

Java線程中的守護線程

Java線程中的守護線程在Java中&#xff0c;守護線程&#xff08;Daemon Thread&#xff09;是一種特殊類型的線程&#xff0c;它在后臺運行&#xff0c;主要用于支持其他線程&#xff08;如用戶線程&#xff09;的工作。守護線程不會阻止JVM&#xff08;Java虛擬機&#xff09;…

Flink-狀態恢復-isRestore分析

isRestored 方法返回值依賴 restoredCheckpointId 是否為空&#xff1a;restoredCheckpointId 在算子狀態句柄&#xff08;StreamOperatorStateHandler&#xff09;中從 StreamOperatorStateContext 獲取并賦值給 StateInitializationContext&#xff08;該 context 就是 initi…

rk3128 emmc顯示剩余容量為0

機器emmc 容量顯示異常&#xff0c;顯示剩余容量為0&#xff0c;這時候做了一個讓 系統不檢測GPP分區部分的操作&#xff0c;此問題才得以解決&#xff0c;如下&#xff1a; system/vold/DirectVolume.cpp -33,6 33,8 #include "VolumeManager.h"#include "Re…

WebAssembly國際化多語種支持

icu linux數據裁剪 先linux編譯出所有的工具 mkdir build && cd build ../configure --prefix=$(pwd)/build_wasm/install --enable-static --disable-shared --with-data-packaging=static --enable-tools=yes --enable-extras=yes --e…

Ubuntu 安裝 etcd 與 etcd-cpp-apiv3

目錄 安裝 etcd 安裝 etcd-cpp-apiv3 安裝 etcd sudo apt update sudo apt install etcd-server sudo apt install -y etcd-client 在 /etc/default/etcd 配置文件中配置&#xff0c;下面示例是單個服務器內進程之間交換信息且只有一個etcd節點。 #節點名稱&#xff0c;默認為…

Spring Boot 集成 GeoTools 詳解

目錄 一、概述二、集成優勢三、集成步驟四、使用場景五、案例&#xff1a;周邊設施查詢系統六、注意事項七、總結 一、概述 什么是 Spring Boot&#xff1f; Spring Boot 是由 Pivotal 團隊開發的基于 Spring 框架的快速開發工具&#xff0c;它通過自動配置、起步依賴等特性簡…

基礎知識:mysql-connector-j依賴

mysql-connector-j 是 MySQL 官方提供的 Java 數據庫連接驅動&#xff08;JDBC Driver&#xff09;&#xff0c;用于在 Java 應用程序中連接和操作 MySQL 數據庫。它是 MySQL 8.0 版本之后的標準驅動名稱&#xff0c;替代了舊的 mysql-connector-java。 一、新舊版本對比 驅動…

vscode remote-ssh 拓展免密訪問 linux虛擬機

前置步驟&#xff0c;在linux安裝好ssh并且win可以使用密碼登錄linux sudo apt install openssh-server -y 在win上檢查密鑰是否存在 檢查公鑰和私鑰cat ~/.ssh/id_rsa.pubcat ~/.ssh/id_rsa 如果不存在&#xff0c;重新生成 ssh-keygen -t rsa -b 4096 重新執行 cat ~/.ssh/…

動手學深度學習-學習筆記【二】(基礎知識)

文章目錄 1、概述2、課程學習2.1、深度學習介紹2.2、安裝2.3、數據操作2.4、數據預處理2.5、線性代數2.6、微積分2.7、自動微分2.8、概率2.8.1、基本概率論2.8.2、處理多個隨機變量2.8.3、期望和方差 2.9、查閱文檔 1、概述 本篇博客用來記錄我學習深度學習的學習筆記&#xf…

瑞盟MS4554N/MS4554N1雙向電平轉換器重新定義混合電壓系統連接

在電子設備的“心臟”——電路系統里&#xff0c;不同功能模塊常因性能需求差異&#xff0c;采用差異化的供電電壓&#xff1a;傳感器用1.8V低功耗運行&#xff0c;主控芯片選3.3V高效處理&#xff0c;傳統接口保留5V穩定傳輸……當這些“電壓孤島”需要互聯時&#xff0c;一個…