大家好,今天我們來聊聊 .NET 9 中一項令人興奮的性能優(yōu)化:zlib-ng 的集成。這頓“免費的午餐”,我們只需升級框架版本即可享用。
zlib-ng:更快的壓縮引擎
在.NET 9中,運行時團隊將原有的 zlib 庫換成了 zlib-ng。zlib-ng 是 zlib 的一個現(xiàn)代化分支,專注于性能和功能的增強。簡單來說,它在壓縮和解壓縮操作中提供了更快的速度和更高的效率,尤其是在處理大數(shù)據(jù)量時,這種優(yōu)勢會更加明顯。
口說無憑,實踐是檢驗真理的唯一標(biāo)準(zhǔn)。我專門編寫了一個性能測試來直觀地評測 .NET 9 和 .NET 8 在壓縮與解壓縮操作上的性能差異。
性能基準(zhǔn)測試
這個測試使用了強大的 BenchmarkDotNet
庫來進行基準(zhǔn)測試,旨在公平地比較兩者在處理相同數(shù)據(jù)集時的表現(xiàn)。
測試代碼
測試邏輯很簡單:
- GlobalSetup: 在所有測試開始前,從微軟官方文檔頁抓取一篇關(guān)于 .NET 9 新特性的文章作為原始數(shù)據(jù)。
- 預(yù)壓縮: 對原始數(shù)據(jù)進行一次預(yù)壓縮,為后續(xù)的解壓縮測試準(zhǔn)備好輸入數(shù)據(jù)。
- Benchmark (壓縮): 測試
GZipStream
將原始數(shù)據(jù)壓縮到內(nèi)存流中的速度。 - Benchmark (解壓): 測試
GZipStream
從內(nèi)存流中解壓數(shù)據(jù)的速度。
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]
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($"壓縮前的數(shù)據(jù)長度: {_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($"壓縮后的數(shù)據(jù)長度: {_compressedData.Length}");
}
[Benchmark(Description = "GZip 壓縮")]
public void Compress()
{
using (var compressedStream = new MemoryStream())
{
using (var gzipStream = new GZipStream(compressedStream, CompressionLevel.Optimal, leaveOpen: true))
{
gzipStream.Write(_dataToCompress, 0, _dataToCompress.Length);
}
}
}
[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)
{
var summary = BenchmarkRunner.Run<GZipBenchmark>();
}
}
測試結(jié)果與分析
話不多說,直接上 BenchmarkDotNet
跑出來的結(jié)果:
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 |
從數(shù)據(jù)中可以清晰地看到:
- 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 無論是在壓縮還是解壓縮操作上,都表現(xiàn)出了遠超 .NET 8 的性能。尤其是在壓縮速度上,提升幅度巨大,幾乎快了四成。

總結(jié):升級即優(yōu)化
.NET 9 中的 zlib-ng 集成為我們開發(fā)者提供了一個開箱即用、性能更強的壓縮解決方案。通過簡單的升級,我們的應(yīng)用程序就能在處理大數(shù)據(jù)量時獲得更快的壓縮和解壓縮速度,從而有效提升整體性能。對于任何需要頻繁進行數(shù)據(jù)壓縮和解壓縮的應(yīng)用場景(例如 Web API、數(shù)據(jù)處理管道、文件服務(wù)等),.NET 9 無疑是一個值得光速升級的版本。
對我們 .NET 開發(fā)者來說,最幸福的事情莫過于此:想得到性能提升,往往只需要將 csproj
文件中的 TargetFramework
里面的數(shù)字調(diào)大即可。這就是 .NET 生態(tài)的魅力所在。
通過簡單的版本升級,開發(fā)者可以輕松享受到框架底層的性能優(yōu)化和功能增強,而無需進行復(fù)雜的代碼修改或重構(gòu),同時還能保持代碼的兼容性和穩(wěn)定性。這種“無痛升級”的設(shè)計理念,使得 .NET 成為一個非常適合快速開發(fā)和迭代的平臺,尤其是在如今這個對性能和效率要求極高的時代。
轉(zhuǎn)自https://www.cnblogs.com/sdcb/p/19009854
該文章在 2025/8/1 9:43:43 編輯過