0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

.NET8极致性能优化AOT

OSC开源社区 来源:OSC开源社区 2023-12-06 10:16 次阅读

前言

.NET8对于性能的优化是方方面面的,所以AOT预编译机器码也是不例外的。本篇来看下对于AOT的优化。

概述

首先要明确一个概念,.NET里面的AOT它是原生的。什么意思呢?也就是说通过ILC编译器(AOT编译器,参考:.Net 7 新编译器 ILC 简析)编译出来的代码是各个平台上可以直接运行的二进制代码。比如MacOS的二进制,Linux二进制等等。所以称之为原生。

C#源码被ILC编译之后,生成了一个完全原生态代码的可执行文件。在执行的时候不需要JIT来编译任何东西,因为JIT已经在ILC里面被充分利用过了。实际上AOT里面也没有包含JIT。那么它如何优化呢?只能是在ILC里面调用JIT的时候了。所以它这个优化依然依靠JIT。.NET8里面优化AOT的一个典型的例子,就是ASP.NET应用程序在使用AOT的时候表现不错,同时也降低了总成本。

在.NET8里面优化AOT的一个重要的目标就是减少AOT可执行文件的大小,关于这点的效果。我们现在就可以看到

下面创建一个控制台应用程序

dotnet new console -o nativeaotexample -f net7.0

由于上面是通过.NET7.0创建的,我们把这个控制台的csproj更改下

net7.0
改为
net7.0;net8.0

可以轻松的构建.NET7.0或者.NET8.0的程序

继续

...项中添加如下
true编译成AOT文件

下面我们就可以通过dotnet publish发布它了,linux如下:

dotnet publish -f net7.0 -r linux-x64 -c Release

现在它生成了一个.NET7.0版本的独立可执行文件,可通过ls/dir 输出目录以查看生成的二进制大小

12820K /home/stoub/nativeaotexample/bin/Release/net7.0/linux-x64/publish/nativeaotexample

这个大约是13M左右,我们再来看下.NET8.0

dotnet publish -f net8.0 -r linux-x64 -c Release

生成的可执行文件大小如下:

1536K/home/stoub/nativeaotexample/bin/Release/net8.0/linux-x64/publish/nativeaotexample

1.5M的大小,这个优化的力度不可不大啊。整整优化了将近10倍的体积。这就是.NET8.0的优化魔力。

但是优化的情况远不止如此,比如说我们可以配置csproj使AOT的体积更小

csproj添加如下size表示要生成的AOT大小
Size

如果我们不需要全球化代码和数据,需要特定的代码和数据,并且使用不变模式,可以csproj添加如下选项

true

如果你不想在AOT异常的时候抛出堆栈,那么你也可以在csproj里面添加如下

false

重新通过dotnet publish net8.0发布了之后,它的体积还可以继续减小

1248K /home/stoub/nativeaotexample/bin/Release/net8.0/linux-x64/publish/nativeaotexample

再次缩小了0.3M大小。

然而,你以为到此优化就为止了吗?并没有,.NET8不仅对AOT编译器内部进行了改进,而且还对单个库也进行了性能优化和改进。比如HttpClient。

当然除了体积的优化之外,还有其它的优化,比如避免了在读取静态字段时的辅助调用,再比如BenchmarkDotNet 也是支持AOT化的,也就是性能测试上面的支持。我们可以只使用 --runtimes nativeaot7.0 nativeaot8.0,而不使用 --runtimes net7.0 net8.0,如下代码

// dotnet run -c Release -f net7.0 --filter "*" --runtimes nativeaot7.0 nativeaot8.0


using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;


BenchmarkSwitcher.FromAssembly(typeof(Tests).Assembly).Run(args);


[HideColumns("Error", "StdDev", "Median", "RatioSD")]
public class Tests
{
    private static readonly int s_configValue = 42;


    [Benchmark]
    public int GetConfigValue() => s_configValue;
}

上面代码可以通过如下AOT化运行

dotnet run -c Release -f net7.0 --filter "*" --runtimes nativeaot7.0 nativeaot8.0

BenchmarkDotNet 输出如下

Method Runtime Mean Ratio
GetConfigValue NativeAOT 7.0 1.1759 ns 1.000
GetConfigValue NativeAOT 8.0 0.0000 ns 0.000

可以看到即使是性能测试的Benchmark,AOT优化也是不放过的。

另外还值得一提的地方就是分层,因为AOT里面没有分层的概念。但是即时编译也就是不是AOT编译的时候,一个方法从tier0提升到tier1,方法里面的静态字段必须被初始化过了。AOT里面添加了一个快速路径检查字段是否初始化,避免一些不必要的开销。

其它的一些改进,比如AOT锁的实现方式。使用了一种混合方式,开始使用轻量级自旋锁,后面升级到使用 System.Threading.Lock 类型,这个应该会在.NET9.0里面释放出来。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    794

    浏览量

    41609
  • 程序
    +关注

    关注

    116

    文章

    3779

    浏览量

    80896
  • 代码
    +关注

    关注

    30

    文章

    4762

    浏览量

    68408
  • 应用程序
    +关注

    关注

    37

    文章

    3250

    浏览量

    57632
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49075

原文标题:.NET8极致性能优化AOT

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式开发极致性能优化案例

    我们之前进行了TFT刷屏测试确认了基本功能。刷屏速度是决定GUI显示帧率最根本的一环,只有优化极致的刷屏速度,才能有基础实现更好效果的GUI。本篇就进行刷屏的优化,其实其思想是通用的,对于其他代码也可以参考。
    的头像 发表于 06-08 11:06 1281次阅读
    嵌入式开发<b class='flag-5'>极致</b><b class='flag-5'>性能</b><b class='flag-5'>优化</b>案例

    .NET8性能优化之线程

    目前来说,没有确切的证据证明哪个线程池好用,或者效率更高。但是开发者可以使用上面的选项来进行自己的选择,有一个测试就是在Windows线程池在比较大的机器上的IO扩展性不太好。如果你的应用程序已经大量的使用了Windows线程池,那么可以通过以上设置为另一个线程池操作也是可以的。此外,线程池经常被阻塞,Windows线程池对此有更多的处理,也能更有效的比托管线程处理的更好。
    的头像 发表于 01-22 14:50 1102次阅读

    保时捷Panamera 2.9T艾森ECU升级:低功率晋级高功率,找回极致性能

    想要打造一款顶级的大型豪华GT跑车,有两个重要因素:一个是极致舒适,另一个必须是极致性能。作为保时捷旗下经典的掀背轿跑,新款Panamera 2.9T 集成了保时捷优良的高贵血统,只可惜保时捷将
    发表于 04-01 17:20

    《现代CPU性能分析与优化》---精简的优化

    来提高程序的性能。由于这本书是Denis在easyperf.net博客分享内容的系统整理和总结。更加偏向实战类型,在阅读过程中,可以直接对自己的C/C++代码进行剖析和优化实验。当然这本书也是有缺点
    发表于 04-18 16:03

    Oracle数据库网络安全访问机制

    本文主要分析了Oracle 客户端通过Net8 访问数据库服务器过程,阐述了Oracle 数据库的网络访问机制以及Net8 在实现Oracle 数据库的服务器和客户端之间安全的数据通信中的重要作用。
    发表于 08-29 10:20 20次下载

    利用缓存技术优化基于ASP.NET的Web GIS性能

    随着Web GIS的快速发展和广泛应用,对Web GIS的性能提出了更高的要求。ASP.NET是微软推出的新一代动态网页技术,它提供了强大的Web应用开发功能,依托ActiveX技术,开发基于ASP.NET的Web
    发表于 09-23 10:54 17次下载

    AOT412 datasheet

    The AOT412 and AOT412L is fabricated with SDMOSTM trench technology that combines excellent RDS
    发表于 09-28 13:38 11次下载
    <b class='flag-5'>AOT</b>412 datasheet

    WindowsCE_NET实时性能的测试与研究

    WindowsCE_NET实时性能的测试与研究
    发表于 10-25 09:26 4次下载
    WindowsCE_<b class='flag-5'>NET</b>实时<b class='flag-5'>性能</b>的测试与研究

    HarmonyOS:极致性能,全栈优化

    性能一直是华为非常专注的一个领域,华为通过HarmonyOS全栈的系统的技术加持和优化,包括内核层、硬件抽象层、runtime层、框架等等。各方面的努力,华为让HarmonyOS的综合性能比基于EMUI有了更大幅度的提升。
    的头像 发表于 06-03 09:08 2481次阅读
    HarmonyOS:<b class='flag-5'>极致</b><b class='flag-5'>性能</b>,全栈<b class='flag-5'>优化</b>

    【专栏精选】嵌入式开发极致性能优化案例

    做电子发烧友技术探索官,分享你的原创电子行业文章! 本期为大家带来一篇嵌入式开发性能优化案例,感兴趣的小伙伴可以关注作者一起学习哦~ 本期推 荐 专栏作者 : 嵌入式USB开发 (点击查看作者主页
    的头像 发表于 06-13 08:15 615次阅读

    .NET 8发布首个RC,比.NET 7的超级快更快!

    此外,RC1 在 .NET MAUI 方面带来了诸多质量改进,修复内存泄露和诸多特定平台的问题,改进了 UI 控制并优化性能,在 Mac 上支持苹果 Xcode 15。
    的头像 发表于 09-18 16:54 1343次阅读
    .<b class='flag-5'>NET</b> <b class='flag-5'>8</b>发布首个RC,比.<b class='flag-5'>NET</b> 7的超级快更快!

    .NET8为原生AOT改进 Linux上原生AOT应用程序大小最多减少50%

    ,它不需要运行时,所有内容都包含在一个文件中。 微软介绍道,.NET 8 为原生 AOT 发布带来了以下改进: 增加对 x64 和 macOS Arm64 架构的支持 将 Linux 上原生
    的头像 发表于 11-14 11:53 1393次阅读
    .<b class='flag-5'>NET8</b>为原生<b class='flag-5'>AOT</b>改进 Linux上原生<b class='flag-5'>AOT</b>应用程序大小最多减少50%

    .NET 8.0中有哪些新的变化?

    发布容器映像,并且默认情况下是非 root 的。由于 .NET 基础映像更小,因此可以更快地部署容器化应用程序 - 包括我们映像的新实验变体,这些变体可为本机 AOT 提供真正最小的应用程序大小。
    的头像 发表于 11-20 16:15 929次阅读
    .<b class='flag-5'>NET</b> 8.0中有哪些新的变化?

    .NET8为什么要引入Non-GC Heap这种机制呢?

    .NET8里面JIT引入了一个新的机制,叫做Non-GC Heap。JIT可以确保相关对象分配在Non-GC Heap上,该堆像其名称一样,不受GC管理。
    的头像 发表于 11-28 10:38 646次阅读

    OPCUA产品情报:.NET SDK最新版本公布,系列产品稳步更新中!

    近期,Unified Automation公司推出了.NET based OPC UA SDK v4.0.0这一产品。该版本除了例行的Bug修复外,还进行了部分函数API的修改与功能的扩展,新添了对使用MQTT/JSON传输的PubSub模块和.NET8的支持。
    的头像 发表于 03-14 10:00 854次阅读
    OPCUA产品情报:.<b class='flag-5'>NET</b> SDK最新版本公布,系列产品稳步更新中!