LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

.NET 9 的免費午餐:GZip 性能提升38.3%

freeflydom
2025年8月1日 9:43 本文熱度 795

大家好,今天我們來聊聊 .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)。

測試代碼

測試邏輯很簡單:

  1. GlobalSetup: 在所有測試開始前,從微軟官方文檔頁抓取一篇關(guān)于 .NET 9 新特性的文章作為原始數(shù)據(jù)。
  2. 預(yù)壓縮: 對原始數(shù)據(jù)進行一次預(yù)壓縮,為后續(xù)的解壓縮測試準(zhǔn)備好輸入數(shù)據(jù)。
  3. Benchmark (壓縮): 測試 GZipStream 將原始數(shù)據(jù)壓縮到內(nèi)存流中的速度。
  4. 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: 在所有基準(zhǔn)測試運行之前執(zhí)行一次
    // 用于初始化測試所需的數(shù)據(jù),避免將數(shù)據(jù)準(zhǔn)備時間計入測試結(jié)果
    [GlobalSetup]
    public async Task GlobalSetup()
    {
        // 從網(wǎng)絡(luò)獲取原始數(shù)據(jù)
        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}");
        // 預(yù)先執(zhí)行一次壓縮,以便為解壓縮基準(zhǔn)測試準(zhǔn)備數(shù)據(jù)
        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); // 創(chuàng)建一個用于解壓測試的流
        }
        Console.WriteLine($"壓縮后的數(shù)據(jù)長度: {_compressedData.Length}");
    }
    // Benchmark: 標(biāo)記這是一個需要進行基準(zhǔn)測試的方法
    [Benchmark(Description = "GZip 壓縮")]
    public void Compress()
    {
        // 使用一個可復(fù)用的MemoryStream來接收壓縮數(shù)據(jù)
        using (var compressedStream = new MemoryStream())
        {
            using (var gzipStream = new GZipStream(compressedStream, CompressionLevel.Optimal, leaveOpen: true))
            {
                gzipStream.Write(_dataToCompress, 0, _dataToCompress.Length);
            }
        }
    }
    // Benchmark: 標(biāo)記這是另一個需要進行基準(zhǔn)測試的方法
    [Benchmark(Description = "GZip 解壓")]
    public void Decompress()
    {
        // 重置流的位置,以便每次解壓都從頭開始
        _compressedStream.Position = 0;
        using (var decompressedStream = new MemoryStream())
        {
            using (var decompressionStream = new GZipStream(_compressedStream, CompressionMode.Decompress, leaveOpen: true))
            {
                // 將解壓后的數(shù)據(jù)讀出
                decompressionStream.CopyTo(decompressedStream);
            }
        }
    }
}
public class Program
{
    public static void Main(string[] args)
    {
        // 啟動BenchmarkDotNet的測試運行器
        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
MethodJobRuntimeMeanErrorStdDevGen0Gen1Gen2Allocated
GZip 壓縮.NET 8.0.NET 8.02,201.7 us23.15 us21.66 us3.9063--120.39 KB
GZip 解壓.NET 8.0.NET 8.0290.3 us4.97 us4.65 us124.5117124.5117124.5117384.53 KB
GZip 壓縮.NET 9.0.NET 9.01,358.2 us25.52 us26.21 us5.8594--120.38 KB
GZip 解壓.NET 9.0.NET 9.0207.7 us3.80 us5.20 us124.7559124.7559124.7559384.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 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲精品亚洲国产3区 | 久久久久亚洲精品首页 | 一本久久a久久精品免费不卡 | 日韩精品色婷婷免费视频 | 亚洲国产日韩精品一区二区 | 久久这里国产综合精品 |