添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
喝醉的青椒  ·  python 屏幕截图-掘金·  1 年前    · 
高大的圣诞树  ·  containers with ...·  1 年前    · 
帅呆的小马驹  ·  SQL SERVER ...·  1 年前    · 

JIT优点:

①可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译)
②可以根据当前程序的运行情况生成最优的机器指令序列
③当程序需要支持动态链接时,只能使用JIT
④可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用

JIT缺点:

①编译需要占用运行时资源,会导致进程卡顿
②由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡
③在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能

AOT优点:

①在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
②可以在程序运行初期就达到最高性能
③可以显著的加快程序的启动

AOT缺点:

①在程序运行前编译会使程序安装的时间增加
②牺牲Java的一致性
③将提前编译的内容保存会占用更多的外

三、与unity关联

1、JIT & Mono编译

Unity的跨平台技术是通过一个Mono虚拟机实现的。而这个虚拟机更新太慢,不能很好地适应众多的平台。
Mono编译流程

Android下会生成:
\assets\bin\Data\Managed\ Assembly-CSharp.dll (游戏的控制逻辑,运行时调用)

\lib\armeabi-v7a\ libmono.so, libmain.so, libunity.so (libmono.so会完成mono VM的功能)

2、AOT & IL2CPP编译

unity公司就自行研发了IL2cpp,把本来应该再mono的虚拟机上跑的中间代码转换成cpp代码,这样再把生成的cpp代码,利用c++的跨平台特性,
在各个平台上通过对各平台都有良好优化的native c++编译器编译,以获得更高的效率和更好的兼容性。
什么是native compiler?什么是cross compiler?
ILL2CPP编译流程

Android下会生成:
\assets\bin\Data\Managed\ Assembly-CSharp.dll 一般不打包进apk(游戏的控制逻辑,只作为中间文件存放,运行时不会调用)

\lib\armeabi-v7a\ libil2cpp.so, libmain.so, libunity.so (libil2cpp.so中包含了游戏控制的native code,和IL2CPP VM功能)

3、IL2CPP相比Mono的优势

①Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成
②Mono版本授权受限
③提高运行效率
④有了IL2CPP,程序尺寸可以相对缩小,运行速度可以提高!
⑤使用了IL2CPP在堆内存分配方面和Mono 相比,Reserved Total 是可以下降的,而 Mono的 Reserved Total 只会上升不会下降。

相关链接:https://blog.csdn.net/h1130189083/article/details/78302502
相关链接:https://www.cnblogs.com/eniac1946/p/7417191.html
相关链接:https://zhuanlan.zhihu.com/p/19972689

11.1.1、 JIT AOT 的区别 JIT AOT 这个名词是指两种不同的编译方式,这两种编译方式的主要区别在于是否在“运行时”进行编译(1) JIT , Just-in-time,动态(即时)编译,边运行边编译;在程序运行时,根据算法计算出热点代码,然后进行 JIT 实时编译,这种方式吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发 JIT 的分层机制。 JIT 缺点就是编译需要占用运行时资源,会导致进程卡顿。 IL2 CPP : 由 Unity 开发的脚本后端。 IL2 CPP .exe将脚本和程序集内的 IL 代码转换为 C++ ,然后为所选平台创建本机二进制文件(例如 .exe、apk、.xap)。可提高项目的性能、安全性和平台兼容性。 .NET:. NET本身很庞大,并不是所有东西都能跨平台,后来. 区别: 主要区别在于是否在“运行时”进行编译. 优劣: AOT 优点: 1.在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗. 2.可以在程序运行初期就达到最高性能. 3.可以显著的加快程序的启动. AOT 缺点: 1.在程序运行前编译会使程序安装的时间增加. 2.牺牲Java的一致性. 3.将提前编译的内容保存会占用更多的外存. JIT 优点: 1.可以根据当前硬件情况实时编译生成最优机器指令( 通过 Mono 运行时 的编译器将IL编译成对应平台的原生码 IL三种转译方式 即时编译(Just in time, JIT ):程序运行过程 ,将CIL的byte code转译为目标平台的原生码。 提前编译(Ahead of time, AOT ):程序运行之前,将.exe或.dll文件 的CIL的byte code部分转译为目标平台的原生码 Runnning on iOS sometimes raise runtime exception. System.ExecutionEngineException: Attempting to JIT compile method Generics is easy to cause a problem of AOT . UniRx use generics pipeline heavy 首先来了解一下 Mono 虚拟机。 Unity 将游戏运行在一个 Mono 虚拟机上,所以能实现跨平台的功能。 但是由于有 Mono 虚拟机的存在所以我们实际打出来的包=(游戏+ mono ),所以 Unity 打出的包会很大。 Profiler 可以查看很多性能有关的 DrawCall DrawCall:就是cpu对图形绘制接口调用,CPU通过调用图形库接口,命令GPU进行渲染操作。一次调用就是一次DrawCall。所以如果调用次数多的话就会大量占据GPU的性 这是基于 unity mono 代码阅读的第三篇。 本文主要介绍怎样将 mono 内嵌到我们的 C++ 控制台程序 。 上文已经介绍了怎样在windows环境下编译一个debug的 mono .dll和创建一个空的工程用来调试我们刚刚编译出来的 mono ,工程的配置部分部分请参考上一篇文章。 接着上一节,我们已经构建好了一个工程,接下来我们按照 mono 官方指引加入代码htt... DrawCalls 就是cpu对图形绘制接口调用,CPU通过调用图形库接口,命令GPU进行渲染操作。一次调用就是一次DrawCall。所以如果调用次数多的话就会大量占据GPU的性能消耗。 优化方案: 1 使用Draw Call Batching,也就是描绘调用批处理。 Unity 在运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们。 2 通过把纹理打包成图集来尽量减少材质的使用。 3 尽量少的使用反光,阴影之类的,因为那会使物体多次渲染。 物理组件(Physics) 设置一个合适的 Mono 作为.Net平台的开源项目,支持Linux,Windows,Mac和Android。其跨平台的特性也是 Unity 选择 Mono 的原因。运行时库(libli2 cpp ):支持 IL2 CPP 虚拟机运行,可以提供GC,线程获取,文件获取,内部调用直接修改托管堆数据结构的。 Unity 编译打包时,使用C#编写的脚本会通过 Mono 的C#编译器打包成IL( 间语言),然后在 Mono 的虚拟机 运行。 AOT :将IL转换成 C++ 源码,然后通过不同平台的 C++ 编译器编译,实现多平台兼容。相对于 Mono 的构建速度慢。    1.带有增高垫IL的c# c#语言作为一种高级语言,是不能直接在我们的CPU上来直接运行的。 需要编译成IL语言(Intermediate Language)即 间层语言(就是这么高冷)。然后由我们的编译器编译成 底层的语言来到cpu运行。IL是将.NET代码转化为机器语言的一个 间语言,因此又把IL语言称之为伪汇编语言。