.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 的各種有趣玩法!

浙公網安備 33010602011771號