.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 - 博客园

Benchmark.NET:让 C# 测试程序性能变得既酷又简单

基准测试工具 --- BenchmarkDotNet - NiueryDiary - 博客园

posted @   唐宋元明清2188  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示