首页 > 其他分享 >.NET8 AOT和JIT的性能,谁更高呢?

.NET8 AOT和JIT的性能,谁更高呢?

时间:2023-12-13 09:44:58浏览次数:33  
标签:编译成 JIT AOT NET8 性能 运行

一:
有人问:.NET8 AOT和JIT的性能,谁更高呢?
原文:.NET8 AOT和JIT的性能,谁更高呢?

其实这个答案非常明显,那就是JIT的性能更高。为什么?原因在哪?因为JIT是随时可能分层编译,动态PGO,CHRL,Non GC Heap,OSR。Quick等极致的优化措施(关于这些措施,可以参考公众号(jianghupt)之前的文章,有详细描述)。只要触发了这些优化的条件。

但是AOT就不一样了,它从一开始就被ILC编译成了二进制的原生代码,只要是被编译成了独立的可执行文件,它的二进制代码就不会再次被优化了。只能是第一次生成的结果,一直不停地运行。

也就是说AOT的代码不能进行运行时候的最大化的优化,但是JIT可以,而且持续性的极端优化,所以JIT的性能无疑是远远高于AOT的。


二:
既然JIT如此强悍,那么AOT的存在有何意义呢?

首先独立的可执行文件是AOT的一大特色,也就是不带任何的动态链接库,单个的可执行文件运行在任何.NET支持的平台上面,清爽,干净,而且可移植性强。其次AOT虽然性能上比之JIT有差距,但是它第一次启动是要高于JIT的。也就是说AOT的性能并不是拉胯,而是折中 了。这其实跟两者的原理有关,AOT因为被编译成了原生的二进制代码,直接在相应的平台上运行,类似于系统级语言的代码比如C/C++这种,所以它编译好了之后,第一次运行的速度是比较快的。但是JIT就不同了,因为JIT第一次运行是遵循一个原则,即是快速的把MSIL编译成机器码,而尽可能最小化的优化。所以JIT的第一次运行性能是很成问题的。但是随着时间推移,多次运行某个函数,或者多次调用程序某个功能,JIT的优势就发挥出来了。赶上以至于超越了AOT。


三:
原文:.NET8 AOT和JIT的性能,谁更高呢?
对此,你有什么看法呢?可以下方留言讨论下

欢迎加入C#12/.NET8技术交流群

标签:编译成,JIT,AOT,NET8,性能,运行
From: https://www.cnblogs.com/tangyanzhi1111/p/17898355.html

相关文章

  • AgileConfig 1.8.0 已适配 .NET8
    Hello大家好。本月圈子里最大的事莫过于.NET8正式release。群友们都在适配.NET8。抽个周末我也把AgileConfig升级到了.NET8。下面把升级的过程简单记录一下,其中有个小坑,对大家升级的时候可能有所帮助。升级升级.NET8修改所有项目的目标框架为.NET8.0升级nuget包......
  • NET8在CentOS7下无法执行的问题
    以二进制模式在CentOS7安装后,运行NET8报错误:#dotnet--list-sdksFailedtoload/usr/share/dotnet/host/fxr/8.0.0/libhostfxr.so,error:/lib64/libstdc++.so.6:version`GLIBCXX_3.4.20'notfound(requiredby/usr/share/dotnet/host/fxr/8.0.0/libhostfxr.so)Theli......
  • .NET8 极致性能优化 AOT
    前言.NET8对于性能的优化是方方面面的,所以AOT预编译机器码也是不例外的。本篇来看下对于AOT的优化。概述首先要明确一个概念,.NET里面的AOT它是原生的。什么意思呢?也就是说通过ILC编译器(AOT编译器,参考:.Net7新编译器ILC简析)编译出来的代码是各个平台上可以直......
  • .NET8极致性能优化AOT
    前言.NET8对于性能的优化是方方面面的,所以AOT预编译机器码也是不例外的。本篇来看下对于AOT的优化。原文:.NET8极致性能优化AOT详述首先明确一个概念,.NET里面的AOT它是原生的。什么意思呢?也就是说通过ILC编译器(AOT编译器,参考:.Net7新编译器ILC简析)编译出来的代码是各个平......
  • 在NET8中使用简化的 AddJwtBearer 认证
    开发环境系统版本:win10.NETSDK:NET8开发工具:vscode参考引用:使用dotnetuser-jwts管理开发中的JSONWeb令牌注意:以下示例中的端口、token等需替换成你的环境中的信息创建项目运行以下命令来创建一个空的Web项目,并添加Microsoft.AspNetCore.Authentication.JwtBea......
  • .NET8 依赖注入
    依赖注入(DependencyInjection,简称DI)是一种设计模式,用于解耦组件(服务)之间的依赖关系。它通过将依赖关系的创建和管理交给外部容器来实现,而不是在组件(服务)内部直接创建依赖对象。​ 咱就是通过IServiceCollection和IServiceProvider来实现的,他们直接被收入到了runtimelibrari......
  • .NET8 极致性能优化 Non-GC Heap
    前言.NET8里面JIT引入了一个新的机制,叫做Non-GCHeap。JIT可以确保相关对象分配在Non-GCHeap上,该堆像其名称一样,不受GC管理。JIT需要保证这个对象没有被GC引用,并且在这个对象的生命周期内一直是根对象(不会被GC消灭的对象)的状态。原文:.NET8极致性能优化Non-......
  • 一个NET8 AOT编译的辅助项目,让你的任何可执行应用快速部署为服务
    ......
  • .Net8新特性
    本文整理.Net8新特性的使用方法。当前包括:RouteShortCircuitExceptionThrowHelperHttpLoggingMiddleware的改进C#12中的InlineArray特性RouteShortCircuit有些请求,如浏览器会自动请求favicon.ico,这些请求即使很简单,往往也会完整地运行中间件管道,但实际上可能并......
  • Jazelle 与 JIT的对比
    对于游戏程序来说,JIT(即时编译)技术可能更适合。这是因为游戏程序通常对性能的要求非常高,并且需要在不同的平台和设备上运行,因此需要一种能够动态优化代码的技术。JIT技术可以在程序运行时将Java字节码编译成本地代码,并且可以针对不同的运行环境和负载条件进行动态优化。这可以提供......