.NET CoreRT AOT原生程序编译使用的一些小建议
微软为 dotnet 提供的一个.NET托管程序的原生程序AOT编译器,但目前限制还是蛮多的,比如动态载入程序集、动态表达式、Emit(反射发出)这些都不被支持(备注:动态表达式,底层实现是基于 Emit)
本文不东扯淡,西扯淡跑出来坑人,只提供一些关于 .NET CoreRT AOT原生编译相对而言较为中肯的建议。
1、动态编程限制:
由于目前.NET AOT编译技术上的一些限制,微软还没有做到把需要动态JIT编译的部分与AOT静态编译的部分混合在一起,只能单AOT静态编译,所以这也就导致了动态编程凉凉,所以不要在程序代码里面用 dynamic 关键字,这会导致.NET编译器生成对应的动态表达式(.NET 4.0 System.Linq.Expressions.Expression)这些表达式会在程序运行时被动态构建,而AOT静态编译首先就干掉了运行时动态编程的能力,当然仍旧保留使用 dynamic 关键字的代码也是可以的,要么不调用,要么TRY-CATCH起来,否则程序立马崩溃。
2、非公开成员反射限制:
尽量不要通过反射调用函数、获取/设置属性/字段的值,但仍旧需要这些是可行的,前提是必须保证成员的公开性,不可以是非 public,否则AOT编译后是无法被反射的,它并不是配置 rd.xml 可解决的问题。
补充:反射不允许不可静态分析性,即动态搞一些字符串运算最终命名在反射的行为,这种是不可以的,Yada!。
3、只用 2.0/2.1/3.0/3.1 .NET CORE SDK.
4、只用 1.0.0-alpha-* 版本的AOT编译器,编译出的原生二进制效率最好,前提是用 .NET CORE SDK 2.1 及以上编译的产品,.NET CORE SDK 2.0 性能相对要弱一点。
目前最新是 7.0.0-* 版本的AOT编译器,只有 1.0.0-alpha-* (ilc)编译出的原生二进制体积最小,并且工作代码效能最高,一般一个原生程序体积越大通常意味着代码效率越加底下。
5、C#/VB.NET 编译代码按微软官方指导原则严格编写代码,否则AOT编译器可能编译代码失败(1.0.0版本),(7.0.0)版本,此问题被大规模改善。
6、CORE RT 服务器上就绪,建议仅限于C/S架构服务器,须妥善的处理工程代码.NET Native AOT原生编译兼容问题。
7、解决方案上面建议按项目需求,妥善配置以下几个 CORE RT 选项
<PropertyGroup>
不要生成堆栈调试数据,即不需要易于阅读的.NET堆栈信息【减少程序体积】
<IlcGenerateStackTraceData>false</IlcGenerateStackTraceData>
裁剪不必要的.NET元数据【减少程序体积】
<IlcTrimMetadata>true</IlcTrimMetadata>
禁止.NET反射,前提不用反射【减少程序体积】
<IlcDisableReflection>true</IlcDisableReflection>
不变全球化,只需要一个 “中文(中国)” 可开【减少程序体积】
<InvariantGlobalization>true</InvariantGlobalization>
优化首选项,Speed 速度选项会导致体积变大【尽可能内联需要.NET程序函数上使用特性声明 inline】,Size 大小选项会减少大小会导致代码性能变低,可以理解为:C/C++ compiler /O0 与 /O2 之间的一个区别。
<IlcOptimizationPreference>Speed</IlcOptimizationPreference>
折叠具有相同 “IL 中间代码” 的方法主体(减少重复代码量),可以减少程序体积,但会导致函数调用堆栈变得混乱。
<IlcFoldIdenticalMethodBodies>true</IlcFoldIdenticalMethodBodies>
</PropertyGroup>
.NET CoreRT AOT原生程序编译使用的一些小建议相关推荐
- mysql种编译码写在哪_深入理解Java虚拟机(程序编译与代码优化)
对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就从虚拟机层面来看看虚拟机对我们所编写的代码采用了哪些优 ...
- 深入理解Java虚拟机——程序编译与代码优化 (转)
2019独角兽企业重金招聘Python工程师标准>>> 深入理解Java虚拟机--程序编译与代码优化 (转) 博客分类: java 一早期(编译期)优化 1概述 Java语言的&qu ...
- python编译为机器码_通过 GraalVM 将 Java 程序编译成本地机器码!
前言 2018年4月,Oracle Labs新公开了一项黑科技:Graal VM. 这是一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为"任何语言"的运行平台使 ...
- 程序编译与代码优化 -- 早期(编译期)优化
1. 概述 Java编译器可能是指一个前端编译器(其实叫"编译器的前端"更准备一些),把*.java文件转变成*.class文件的过程:也可能是指虚拟机的后端运行期编译器(JIT编 ...
- 深入理解Java虚拟机-程序编译与代码优化
本博客主要参考周志明老师的<深入理解Java虚拟机>第二版 读书是一种跟大神的交流.阅读<深入理解Java虚拟机>受益匪浅,对Java虚拟机有初步的认识.这里写博客主要出于以下 ...
- java虚拟机编译顺序_深入理解Java虚拟机(程序编译与代码优化)
文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...
- 第八章 Android 原生程序开发与逆向分析(五)(原生 C 程序逆向分析)
文章目录 原生 C 程序逆向分析 编译原生 C 程序 for 循环分支结构 for1() for2() while 循环分支结构 dowhile() whiledo() if--else 分支结构 i ...
- 第八章 Android 原生程序开发与逆向分析(三)(原生程序文件格式)
文章目录 原生程序文件格式 原生程序的文件类型 AArch64 ELF 文件格式 e_ident e_type e_machine e_version e_entry e_phoff e_shoff ...
- Android系统的命令行操作及C程序编译
在Android系统执行C程序,需要使用Android系统的专用编译器NDK,下载NDK工具可以通过以下博文中给出的链接: https://blog.csdn.net/baidu_35904821/a ...
最新文章
- 释放联接新价值,华为提出“1+N”5G目标网,推动运营商构筑四大数字化转型的核心能力
- Java异常信息处理
- Ubuntu14.04安装apt-get方法Lnmp环境
- 如何一秒钟从头构建一个 ASP.NET Core 中间件
- LeetCode 965单值二叉树-简单
- python用户登录三次机会的注释_用户登录(三次错误机会)(示例代码)
- close wait 过多原因_从Linux源码看TIME_WAIT状态的持续时间
- 阶段3 3.SpringMVC·_06.异常处理及拦截器_2 SpringMVC异常处理之演示程序异常
- 一、目标检测入门VOC2012
- 来自学长师兄们的应届校招经验
- 利用stylecloud制作更酷炫的词云图
- vscode 无法跳转到定义引用
- 全国各地DNS地址详细列表
- 全新界面下拉整理 点心省电3.0版
- 你的、我的、我们的翻转课堂
- SpringBoot错误-Correct the classpath of your application so that it contains a single, compatible vers
- 雪球(Snow Ball)定价实作:使用Heston模型与GPU加速运算
- OPEN--深度开源
- 2012年考研计算机统考真题及答案解析
- 关于网页版微信扫码登录以及获取用户信息
热门文章
- HDU 1218 - Blurred Vision
- 关于linux系统密码策略的设置
- [Azure DevOps] 如何安装并配置 Build Agent
- 【LuKS】Vba开发从入门到精通 =.=
- 【1163】阿克曼(Ackmann)函数
- 从CSDN账户密码被盗说起
- 蓝桥杯2022年第十三届省赛真题-纸张尺寸
- 手把手系列--验证自己编写的STM32H750XBH6_ArtPi平台Keil MDK Flash下载算法
- centos 7.6 —— Nginx 配置网页防盗链FPM参数优化
- 7天酒店斩获五洲钻石奖“年度投资价值酒店连锁品牌” 打造酒店投资极致性价比