当前位置: 首页 > news >正文

基于杨中科老师的GC示例,写一个Benchmark

很久之前,我看到杨中科老师的一篇文章
谁说.NET没有GC调优?只改一行代码就让程序不再占用内存受益匪浅。

最近遇到了类似的问题,不过细节有点忘了,于是又回顾了一下,顺便写了一个Benchmark,加强了一下印象。

// ==================== 数据类型定义 ====================// 1. 原始 Class 定义public class WeatherForecastClass{public DateOnly Date { get; set; }public int TemperatureC { get; set; }public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);public string Summary { get; set; }}// 2. 优化方案二:Struct 定义public struct WeatherForecastStruct{public DateOnly Date { get; set; }public int TemperatureC { get; set; }public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);public string Summary { get; set; }}// ==================== 基准测试类 ====================[MemoryDiagnoser] // 开启内存诊断,关注内存分配和GC次数public class ToArrayContext{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};// 模拟文中提到的 150,000 条数据private const int Count = 150_000;/// <summary>/// 方案一(基线):Class + ToArray()/// 问题:产生大对象(LOH),内存占用高,GC压力大/// </summary>[Benchmark(Baseline = true)]public WeatherForecastClass[] GetClassToArray(){return Enumerable.Range(1, Count).Select(index => new WeatherForecastClass{Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();}/// <summary>/// 方案一 的 List 对照/// </summary>[Benchmark]public List<WeatherForecastClass> GetClassToList(){return Enumerable.Range(1, Count).Select(index => new WeatherForecastClass{Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToList();}/// <summary>/// 方案一优化:Class + 流式返回 (IEnumerable)/// 优势:没有 ToArray() 产生的数组对象,流水线作业,内存占用极低/// 注意:为了在 Benchmark 中公平比较“执行完整逻辑”,这里强制迭代一次模拟消费过程。/// </summary>[Benchmark]public void GetClassStream(){var result = Enumerable.Range(1, Count).Select(index => new WeatherForecastClass{Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]});// 模拟消费者(如 JSON 序列化器)逐条读取数据// 只有迭代才会真正创建对象foreach (var _ in result) { }}/// <summary>/// 方案二优化:Struct + ToArray()/// 优势:Struct 内存布局更紧凑,无对象头开销,数组占用内存减半/// 注意:虽然内存占用减半,但仍然有一次 ToArray() 的大块内存分配/// </summary>[Benchmark]public WeatherForecastStruct[] GetStructToArray(){return Enumerable.Range(1, Count).Select(index => new WeatherForecastStruct{Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();}}// ==================== 程序入口 ====================//public class Program//{//    public static void Main(string[] args)//    {//        // 运行基准测试//        var summary = BenchmarkRunner.Run<ToArrayContext>();//    }//}

运行结果如下:


BenchmarkDotNet=v0.13.5, OS=Windows 10 (10.0.19045.6466/22H2/2022Update)
Intel Core i7-9700 CPU 3.00GHz, 1 CPU, 8 logical and 8 physical cores
.NET SDK=8.0.200[Host]     : .NET 8.0.11 (8.0.1124.51707), X64 RyuJIT AVX2DefaultJob : .NET 8.0.11 (8.0.1124.51707), X64 RyuJIT AVX2
Method Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
GetClassToArray 13.504 ms 0.2631 ms 0.3132 ms 1.00 0.00 1000.0000 718.7500 296.8750 5.72 MB 1.00
GetClassToList 13.169 ms 0.1357 ms 0.1269 ms 0.97 0.03 1000.0000 718.7500 296.8750 5.72 MB 1.00
GetClassStream 5.977 ms 0.0235 ms 0.0196 ms 0.44 0.01 757.8125 - - 4.58 MB 0.80
GetStructToArray 5.488 ms 0.0162 ms 0.0151 ms 0.41 0.01 328.1250 328.1250 328.1250 2.29 MB 0.40
http://www.jsqmd.com/news/443518/

相关文章:

  • 公开课 | 软件测试行业的发展与思考
  • 小龙虾Openclaw Win10系统安装指引 - Bill
  • 视程空间推出多镜头红外拼接方案,实现90°-720°全景视野!
  • 购物卡变现最佳方法,沃尔玛卡回收攻略! - 团团收购物卡回收
  • 2026分析郴州青少年叛逆学校,探讨如何选择性价比高的学校 - 工业设备
  • 解锁APP推广密码:关键词安装与ASO优化的协同效应
  • 火狐浏览器 测试住友驱动,能显示特殊字符
  • 告别听歌限制✨!Navidrome 搭建私人音乐库,cpolar 让音乐走到哪听到哪
  • 计算机毕业设计springboot试题库管理系统的设计与实现 基于Spring Boot的智慧教育题库资源管理平台设计与实现 Spring Boot框架下高校智能组卷与评测系统开发研究
  • 聊聊2026年营业信托法律服务律师,选哪家性价比高 - 工业品网
  • 食品行业高精度的椰果封杯机设备
  • 计算机毕业设计springboot学生活动管理系统 基于SpringBoot框架的高校第二课堂活动管理平台 SpringBoot驱动的校园课外活动数字化管理系统
  • 基于YOLOv8的桥梁结构(轴承,封板端部,三角撑板连接,面外加劲板)智能识别(中英文双版) | 附完整源码与效果演示
  • 2026冲刺用!更贴合本科生的降AI率平台,千笔·降AI率助手 VS 万方智搜AI
  • 2026年环卫设备厂家推荐排行榜:压缩式垃圾箱、垃圾中转站配套车辆、垃圾站压缩机、水平/垂直/地埋式垃圾压缩机等全品类深度解析与选购指南 - 品牌企业推荐师(官方)
  • 中欧班列门到门运输服务哪家口碑好,在佛山地区怎么选择 - 工业品牌热点
  • 2026年河北地区节日花灯生产企业盘点,哪家比较靠谱 - myqiye
  • 2026年 垃圾站除臭设备厂家实力推荐榜:地埋式垃圾站/中转站/压缩处理设备,专业除臭与高效运行口碑之选 - 品牌企业推荐师(官方)
  • 聊聊镜视界国际眼镜城,杭州有儿童配镜区的品牌推荐 - mypinpai
  • 2026年四川单招培训优质机构推荐榜高公办上岸率之选 - 优质品牌商家
  • Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%
  • 分析2026年节日花灯专业厂家口碑,看看哪家更靠谱 - myqiye
  • 探讨2026年青海婚纱摄影热门品牌,青海蒙娜丽莎婚纱摄影实力靠谱吗 - 工业推荐榜
  • Windows 11 下编译 diff-gaussian-rasterization 完整踩坑记录——PyTorch 2.7.1+cu126 × CUDA Toolkit 13.1 × RTX
  • 变压器、箱式变电站、电抗器优质厂商怎么选?2026 年行业优选企业推荐 - 深度智识库
  • 在UE5中,将UI中的文本框(Text Block)与C++变量关联和使用
  • 支腿转台ABB机器人弧焊节气方案
  • 别再被“速成班”割韭菜了!真正的网安高手,都在按这个顺序打基础
  • T8000-W钨在线分析仪凭什么精准测钨溶度
  • 未来已来——家庭能源管理的“智慧大脑”