.NET 9 的免费午餐:GZip 性能提升38.3%
大家好,今天我们来聊聊 .NET 9 中一项令人兴奋的性能优化:zlib-ng 的集成。这顿“免费的午餐”,我们只需升级框架版本即可享用。
zlib-ng:更快的压缩引擎
在.NET 9中,运行时团队将原有的 zlib 库换成了 zlib-ng。zlib-ng 是 zlib 的一个现代化分支,专注于性能和功能的增强。简单来说,它在压缩和解压缩操作中提供了更快的速度和更高的效率,尤其是在处理大数据量时,这种优势会更加明显。
口说无凭,实践是检验真理的唯一标准。我专门编写了一个性能测试来直观地评测 .NET 9 和 .NET 8 在压缩与解压缩操作上的性能差异。
性能基准测试
这个测试使用了强大的 BenchmarkDotNet 库来进行基准测试,旨在公平地比较两者在处理相同数据集时的表现。
测试代码
测试逻辑很简单:
- GlobalSetup: 在所有测试开始前,从微软官方文档页抓取一篇关于 .NET 9 新特性的文章作为原始数据。
- 预压缩: 对原始数据进行一次预压缩,为后续的解压缩测试准备好输入数据。
- Benchmark (压缩): 测试
GZipStream将原始数据压缩到内存流中的速度。 - Benchmark (解压): 测试
GZipStream从内存流中解压数据的速度。
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using BenchmarkDotNet.Jobs;
using System.IO.Compression;
using System.Text;
[MemoryDiagnoser]
[RPlotExporter]
[SimpleJob(RuntimeMoniker.Net80)]
[SimpleJob(RuntimeMoniker.Net90)]
public class GZipBenchmark
{
private byte[] _dataToCompress = null!;
private byte[] _compressedData = null!;
private MemoryStream _compressedStream = null!;
// GlobalSetup: 在所有基准测试运行之前执行一次
// 用于初始化测试所需的数据,避免将数据准备时间计入测试结果
[GlobalSetup]
public async Task GlobalSetup()
{
// 从网络获取原始数据
string originalData = await new HttpClient().GetStringAsync("https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-9/libraries");
_dataToCompress = Encoding.UTF8.GetBytes(originalData);
Console.WriteLine($"压缩前的数据长度: {_dataToCompress.Length}");
// 预先执行一次压缩,以便为解压缩基准测试准备数据
using (var memoryStream = new MemoryStream())
{
using (var gzipStream = new GZipStream(memoryStream, CompressionLevel.Optimal, leaveOpen: false))
{
gzipStream.Write(_dataToCompress, 0, _dataToCompress.Length);
}
_compressedData = memoryStream.ToArray();
_compressedStream = new MemoryStream(_compressedData); // 创建一个用于解压测试的流
}
Console.WriteLine($"压缩后的数据长度: {_compressedData.Length}");
}
// Benchmark: 标记这是一个需要进行基准测试的方法
[Benchmark(Description = "GZip 压缩")]
public void Compress()
{
// 使用一个可复用的MemoryStream来接收压缩数据
using (var compressedStream = new MemoryStream())
{
using (var gzipStream = new GZipStream(compressedStream, CompressionLevel.Optimal, leaveOpen: true))
{
gzipStream.Write(_dataToCompress, 0, _dataToCompress.Length);
}
}
}
// Benchmark: 标记这是另一个需要进行基准测试的方法
[Benchmark(Description = "GZip 解压")]
public void Decompress()
{
// 重置流的位置,以便每次解压都从头开始
_compressedStream.Position = 0;
using (var decompressedStream = new MemoryStream())
{
using (var decompressionStream = new GZipStream(_compressedStream, CompressionMode.Decompress, leaveOpen: true))
{
// 将解压后的数据读出
decompressionStream.CopyTo(decompressedStream);
}
}
}
}
public class Program
{
public static void Main(string[] args)
{
// 启动BenchmarkDotNet的测试运行器
var summary = BenchmarkRunner.Run<GZipBenchmark>();
}
}
测试结果与分析
话不多说,直接上 BenchmarkDotNet 跑出来的结果:
BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
AMD Ryzen 7 5800X 3.80GHz, 1 CPU, 16 logical and 8 physical cores
.NET SDK 10.0.100-preview.5.25277.114
[Host] : .NET 9.0.6 (9.0.625.26613), X64 RyuJIT AVX2
.NET 8.0 : .NET 8.0.17 (8.0.1725.26602), X64 RyuJIT AVX2
.NET 9.0 : .NET 9.0.6 (9.0.625.26613), X64 RyuJIT AVX2
| Method | Job | Runtime | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|---|---|---|---|---|---|---|---|---|---|
| GZip 压缩 | .NET 8.0 | .NET 8.0 | 2,201.7 us | 23.15 us | 21.66 us | 3.9063 | - | - | 120.39 KB |
| GZip 解压 | .NET 8.0 | .NET 8.0 | 290.3 us | 4.97 us | 4.65 us | 124.5117 | 124.5117 | 124.5117 | 384.53 KB |
| GZip 压缩 | .NET 9.0 | .NET 9.0 | 1,358.2 us | 25.52 us | 26.21 us | 5.8594 | - | - | 120.38 KB |
| GZip 解压 | .NET 9.0 | .NET 9.0 | 207.7 us | 3.80 us | 5.20 us | 124.7559 | 124.7559 | 124.7559 | 384.56 KB |
从数据中可以清晰地看到:
- GZip 压缩:.NET 9 的平均耗时为 1,358.2 us,相比 .NET 8 的 2,201.7 us,性能提升了约 38.3%!这是一个非常显著的进步。
- GZip 解压:.NET 9 的平均耗时为 207.7 us,相比 .NET 8 的 290.3 us,性能提升了约 28.5%。
可见,.NET 9 无论是在压缩还是解压缩操作上,都表现出了远超 .NET 8 的性能。尤其是在压缩速度上,提升幅度巨大,几乎快了四成。

总结:升级即优化
.NET 9 中的 zlib-ng 集成为我们开发者提供了一个开箱即用、性能更强的压缩解决方案。通过简单的升级,我们的应用程序就能在处理大数据量时获得更快的压缩和解压缩速度,从而有效提升整体性能。对于任何需要频繁进行数据压缩和解压缩的应用场景(例如 Web API、数据处理管道、文件服务等),.NET 9 无疑是一个值得光速升级的版本。
对我们 .NET 开发者来说,最幸福的事情莫过于此:想得到性能提升,往往只需要将 csproj 文件中的 TargetFramework 里面的数字调大即可。这就是 .NET 生态的魅力所在。
通过简单的版本升级,开发者可以轻松享受到框架底层的性能优化和功能增强,而无需进行复杂的代码修改或重构,同时还能保持代码的兼容性和稳定性。这种“无痛升级”的设计理念,使得 .NET 成为一个非常适合快速开发和迭代的平台,尤其是在如今这个对性能和效率要求极高的时代。
感谢阅读到这里,如果感觉本文对您有帮助,请不吝评论和点赞,这也是我持续创作的动力!
也欢迎加入我的 .NET骚操作 QQ群:495782587,一起交流 .NET 和 AI 的各种有趣玩法!
.NET 9 的免费午餐:GZip 性能提升38.3%的更多相关文章
- YbSoftwareFactory 代码生成插件【二十一】:Web Api及MVC性能提升的几个小技巧
最近在进行 YbSoftwareFactory 的流程功能升级,目前已经基本完成,现将用到的一些关于 Web Api 及 MVC 性能提升的一些小技巧进行了总结,这些技巧在使用.配置上也相当的简单,但 ...
- 在PYTHON中使用StringIO的性能提升实测(更新list-join对比)
刚开始学习PYTHON,感觉到这个语言真的是很好用,可以快速完成功能实现. 最近试着用它完成工作中的一个任务:在Linux服务器中完成对.xml.gz文件的解析,生成.csv文件,以供SqlServe ...
- Web 应用性能提升 10 倍的 10 个建议
转载自http://blog.jobbole.com/94962/ 提升 Web 应用的性能变得越来越重要.线上经济活动的份额持续增长,当前发达世界中 5 % 的经济发生在互联网上(查看下面资源的统计 ...
- 再谈HTTP2性能提升之背后原理—HTTP2历史解剖
即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...
- VNF网络性能提升解决方案及实践
VNF网络性能提升解决方案及实践 2016年7月 作者: 王智民 贡献者: 创建时间: 2016-7-20 稳定程度: 初稿 修改历史 版本 日期 修订人 说明 1.0 20 ...
- asp.net 性能提升
原文链接:http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance ASP.NET Web API 是非常 ...
- oracle 11g亿级复杂SQL优化一例(数量级性能提升)
自从16年之后,因为工作原因,项目中就没有再使用oracle了,最近最近支持一个项目,又要开始负责这块事情了.最近在跑性能测试,配置全部调好之后,不少sql还存在性能低下的问题,主要涉及执行计划的不合 ...
- Web 应用性能提升的 10 个建议
建议一.利用反向代理服务器加速和保护应用 如果 Web 应用运行在一台独立的电脑上,性能问题的解决方案是显而易见的:换一台更快的电脑,里面加上更多的处理器.内存.快速磁盘阵列等等.然后在这台新电脑上运 ...
- 极速Node.js:来自LinkedIn的10个性能提升秘籍
from:http://faylai.iteye.com/blog/1293194 1.避免使用同步的方法 nodejs 是基于单线程.为了让单线程能够处理高并发的请求,我们尽量要避免让线程等待,阻塞 ...
- Nginx网络架构实战学习笔记(三):nginx gzip压缩提升网站速度、expires缓存提升网站负载、反向代理实现nginx+apache动静分离、nginx实现负载均衡
文章目录 nginx gzip压缩提升网站速度 expires缓存提升网站负载 反向代理实现nginx+apache动静分离 nginx实现负载均衡 nginx gzip压缩提升网站速度 网页内容的压 ...
随机推荐
- SQL 强化练习 (二)
继续 sql 搞起来, 面向过程来弄, 重点是分析的思路, 涉及的的 left join, inner join, group by +_ having, case when ... 等场景, 也是比 ...
- 梯度下降(Gradient Descent)法
梯度下降法(Gradient Descent)是求解无约束最优化问题最常用的方法之一,它是一种迭代方法,每一步的主要操作就是求解目标函数的梯度向量,将当前位置的负梯度方向作为搜索方向. 直观的表示可用 ...
- codeup之日期差值
description 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天. Input 有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD Outp ...
- B1032 挖掘机技术哪家强
为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 10 5 的正整数 N,即参赛人数.随后 N ...
- odoo知识图谱
最近项目交付后,准备将系统整个知识点整理一下,下面是目录,后面针对目录编写文档--todo
- SQL语句between and边界问题
BETWEEN AND 需要两个参数,即范围的起始值a和终止值b,而且要求a<b.如果字段值在指定的[闭区间[a,b]]内,则这些记录被返回:否则,记录不会被返回. 字段值可以是数值.文本 ...
- Spring、Spring Framework、Spring Boot、Spring Cloud的区别
Spring Spring是一个生态体系(也可以说是技术体系),是集大成者,它包含了Spring Framework.Spring Boot.Spring Cloud等(还包括Spring Cloud ...
- update注入之我理解
1.基本语法 update test.test_table set username='admin123',password=000 where id=1; update test.test_tabl ...
- FastAPI认证系统:从零到令牌大师的奇幻之旅
title: FastAPI认证系统:从零到令牌大师的奇幻之旅 date: 2025/06/06 16:13:06 updated: 2025/06/06 16:13:06 author: cmdra ...
- Kubernetes控制器-Deployment
Kubernetes控制器-Deployment 我们已经知道ReplicaSet控制器是用来维护集群中运行的Pod数量的,但是往往在实际操作时候,我们反而不去直接使用RS,而是使用更上层的控制器,比 ...