.NET 代码性能测试Benchmark
记录下Benchmark性能测试使用。
这里以测试数据拷贝场景为例,先安装Nuget-BenchmarkDonet包
添加Benchmark测试类:
1 [MemoryDiagnoser] 2 public class BenchmarkTest 3 { 4 private readonly BenchmarkTestMode _data; 5 6 public BenchmarkTest() 7 { 8 _data = GetData(); 9 } 10 //[Benchmark] 11 //public void ShallowCloneByMemberwiseClone() 12 //{ 13 // var original = _data; 14 // for (int i = 0; i < 1000; i++) 15 // { 16 // var clone = original.ShallowClone(); 17 // } 18 //} 19 //[Benchmark] 20 //public void ShallowCloneByRecordWith() 21 //{ 22 // var original = _data; 23 // for (int i = 0; i < 1000; i++) 24 // { 25 // var clone = original with { }; 26 // } 27 //} 28 [Benchmark] 29 public void DeepCloneByManual() 30 { 31 var original = _data; 32 for (int i = 0; i < 1000; i++) 33 { 34 var benchmarkTestMode = new BenchmarkTestMode() 35 { 36 Angle = original.Angle, 37 Name = original.Name, 38 Points = original.Points.Select(i => new Point(i.X, i.Y)).ToList() 39 }; 40 } 41 } 42 [Benchmark] 43 public void DeepCloneByMemberwiseCloneManual() 44 { 45 var original = _data; 46 for (int i = 0; i < 1000; i++) 47 { 48 var clone = original.DeepClone(); 49 } 50 } 51 [Benchmark] 52 public void DeepCloneByDataContractSerializer() 53 { 54 var original = _data; 55 for (int i = 0; i < 1000; i++) 56 { 57 using var stream = new MemoryStream(); 58 var serializer = new DataContractSerializer(typeof(BenchmarkTestMode)); 59 serializer.WriteObject(stream, original); 60 stream.Position = 0; 61 var clone = (BenchmarkTestMode)serializer.ReadObject(stream); 62 } 63 } 64 [Benchmark] 65 public void DeepCloneBySystemTextJson() 66 { 67 var original = _data; 68 for (int i = 0; i < 1000; i++) 69 { 70 var data = System.Text.Json.JsonSerializer.Serialize(original); 71 var clone = System.Text.Json.JsonSerializer.Deserialize<BenchmarkTestMode>(data); 72 } 73 } 74 75 private BenchmarkTestMode GetData() 76 { 77 var original = new BenchmarkTestMode() { Name = "Test", Angle = 20 }; 78 original.Points = new List<Point>(); 79 for (int i = 0; i < 1000; i++) 80 { 81 original.Points.Add(new Point(i, 1000 - i)); 82 } 83 return original; 84 } 85 } 86 87 public record class BenchmarkTestMode 88 { 89 public string Name { get; set; } 90 public int Angle { get; set; } 91 public List<Point> Points { get; set; } 92 public BenchmarkTestMode ShallowClone() 93 { 94 return (BenchmarkTestMode)this.MemberwiseClone(); 95 } 96 public BenchmarkTestMode DeepClone() 97 { 98 var clone = (BenchmarkTestMode)this.MemberwiseClone(); 99 clone.Points = Points.Select(i => new Point(i.X, i.Y)).ToList(); 100 return clone; 101 } 102 }
运行BenchmarkTest,
1 var summary = BenchmarkRunner.Run<BenchmarkTest>(); 2 Console.WriteLine(summary);
运行结果如下:
在 BenchmarkDotNet
中统计数据列大概有90多条,可以参考(https://github.com/dotnet/BenchmarkDotNet/blob/master/src/BenchmarkDotNet/Columns/Column.cs)
以下是常用统计列,简单解释:
- Method: 测试方法的名称。
- Mean: 所有测试运行的平均时间。
- Error: 测试运行的标准误差,标准误差是测试结果的离散程度的度量,标准误差越小,表示测试结果越稳定。
- StdDev: 所有测试运行的标准偏差,标准偏差是测试结果的离散程度的度量,标准偏差越小,表示测试结果越接近平均值。
- Gen 0: 所有测试运行期间生成的第 0 代垃圾回收的次数。垃圾回收是 .NET 运行时自动回收不再使用的内存的机制,Generational Garbage Collection 是 .NET 中的一种垃圾回收算法。
- Gen 1: 所有测试运行期间生成的第 1 代垃圾回收的次数。
- Gen 2: 所有测试运行期间生成的第 2 代垃圾回收的次数。
- Allocated: 所有测试运行期间分配的内存总量。
参考文章:
【基准测试】BenchmarkDotNet介绍 - WilsonPan - 博客园
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)