imtoken国际版钱包|aot
对比JIT和AOT,各自有什么优点与缺点? - 知乎
对比JIT和AOT,各自有什么优点与缺点? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册程序员编程Java即时编译(JIT)编译器对比JIT和AOT,各自有什么优点与缺点?1.JIT (Just-In-Time - 实时编译) 和 AOT (Ahead-Of-Time - 预先编译),各自有什么优点与缺点? 请比较一下两…显示全部 关注者548被浏览437,309关注问题写回答邀请回答好问题 19添加评论分享15 个回答默认排序GlavoJVM新闻速递 GitHub/B站/爱发电: Glavo 关注通常来说,JIT 峰值性能更高,支持更多动态特性,更有利于调试;AOT 启动速度更快,资源占用略低。JIT 相比 AOT 的优势:实用化的 PGO(Profile-Guided Optimizations)所谓的 PGO,指的是程序根据某些指导性的信息进行更深层次的优化。PGO 很多时候能带来两位数百分比的峰值吞吐提升,优化幅度不小。虽然不管 JIT 还是 AOT 都能利用 PGO 进行优化,但 PGO 往往需要根据统计信息来优化,在程序中收集统计信息无疑会付出额外的成本。AOT+PGO 通常需要先编译一次程序用于收集统计信息,在真实或者仿真场景下运行后,再根据收集到的信息重新编译程序。这种两次编译的部署流程非常繁琐耗时,所以 AOT+PGO 往往只是用来跑个好看的 benchmark 成绩,现实中很少选择真的用 PGO 部署。但 PGO 对于 JIT 来说的意义完全不同。JIT 的解释器(以及使用分层编译时的低级编译层次)阶段本来就不追求极致性能,刚好非常适合收集 PGO 所用的数据,PGO 对于 JIT 语言来说几乎是纯提升,实现了 PGO 的 JIT 语言基本都默认开启 PGO,峰值性能总是能享受到 PGO 的进步,所以能投入现实广泛部署的 PGO 是 JIT 相较 AOT 的一大优势。更强大的 LTO(Link Time Optimization)传统的 AOT 编译时优化是基于源码在编译单元内的优化,而 LTO 则是在链接阶段进行的跨越编译单元的优化。虽然 LTO 能够跨越编译单元优化,但这种跨越还是有边界的,比如对于 AOT 语言来说,动态链接库就是 LTO 优化的边界,动态链接的符号无法进行内联,必须老老实实遵守 ABI 调用,这就丧失了很多优化机会。而对于 JIT 编译器来说,动态加载甚至动态生成的代码都是“源代码”,不用 FFI 调用别的语言就不存在边界,因此 JIT 能在无法全部静态链接的情况下完全优化代码,这是 AOT 无法做到的。基于运行时环境的优化相比在分发前或者部署时就要生成机器码的 AOT,JIT 进行编译的时间节点要更晚,这意味着 JIT 编译器比 AOT 编译器掌握更多知识,像运行时设备的硬件信息、一次性读取的配置文件或用户输入等等对于 JIT 编译器来说都是 constexpr,JIT 可以完全利用这些信息优化生成的代码。更强大的“编译时计算”C++/Dlang 等以 AOT 为主的语言追求“编译时计算”的能力,将各类操作移动至编译时从而实现运行时的“zero cost”。但对于依赖 JIT 的语言来说,它们的“编译时”和“运行时”本身就没有清晰的分界,编译和运行过程是可以交替进行的。它们可以完全不用任何新的语言构造,在运行时使用完整的语言功能(甚至包括 I/O)进行“编译时计算”以及代码生成。无论此阶段怎么做,付出的代价都只是启动时间,对于 JIT 语言最关心的峰值性能来说都是“zero cost”的。其他更灵活的动态功能除了上面所说的,也有其他动态功能是 JIT 容易做而 AOT 很难做到的,比如 HotSwap,也就是在运行时不停机热更新函数的功能。由于会破坏 inline 等优化,对于 AOT 语言来说 HotSwap 实现起来很困难且局限性很大,但 JIT 就能按需丢弃所有 inline 了此函数的函数的机器码,并重新基于新实现进行优化,从而很低成本的实现该功能。AOT 相比 JIT 的优势:启动时间更短由于 JIT 需要在运行时编译程序,所以启动时需要一段时间的预热才能达到峰值性能,而 AOT 不需要预热,因此启动时间更短,这对于小型程序和微服务来说很重要。内存占用更低JIT 编译器需要收集程序信息和编译程序,因此需要一些额外的内存存储这部分信息。AOT 不需要在运行时占用这部分资源,因此资源消耗更低。可以做更复杂的优化由于 JIT 编译需要占用运行时的时间和资源,所以作为取舍,JIT 可能会放弃一些复杂的优化换取编译速度。AOT 编译过程属于独立阶段,不影响运行速度,因此可以考虑采用更复杂的优化,花费更多编译时间换取更高的运行性能。难以反编译JIT 编译器的输入通常是源代码或较高级别的中间代码,其中包含了大量元信息,即使使用混淆等手段也容易被破解。AOT 编译将程序翻译为机器码,语言层面的结构大部分不会被保留,因此更难被破解。上面说的都是 AOT 和 JIT 比较传统的一些优缺点,这些优缺点也不是绝对的,现在人们也在尝试弥补 AOT 和 JIT 的缺陷。比如 Graal 在 AOT 时使用预训练的机器学习模型自动推导 PGO 所需要的 Profile;比如 JIT 通过缓存 Profile 和生成的机器码,以及将部分运行时计算提早到运行前来加快预热;比如 Azul 的 Cloud Native Compiler 将 JIT 服务挪移到单独的编译服务器上,通过在多台运行服务器间共享 Profile 和生成的机器码以减少重复工作,同时也允许进行更占资源的复杂优化。编辑于 2023-09-16 13:10赞同 11613 条评论分享收藏喜欢收起知乎用户JIT:吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发 JIT 的分层机制AOT:内存占用低,启动速度快,可以无需 runtime 运行,直接将 runtime 静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化以 CoreCLR 为例,不做 AOT 编译的 asp.net core 网站项目,通常冷启动时间需要 150ms左右,但是启动后随着程序运行,JIT 再次生成更优的代码,甚至会为频繁使用的泛型类特化出一套实现;而经过 ReadyToRun 技术编译初始化部分,可以既保留 JIT,同时将程序初始化的部分采用 AOT 技术加速,将启动时间减少到 80ms 左右;最后是纯 AOT,采用CoreRT 编译后,启动速度可以直接达到 10ms 以下。AWS 的 FaaS 服务中,.NET Core 的函数计算服务利用 ReadyToRun/CoreRT 等技术,使得其启动速度成为冠军。不过 .NET Core 内存占用本身就非常小,进行 AOT 编译带来的内存占用优势几乎可以忽略不计,然而 Full AOT 却使得很多高级特性无法实现,例如表达式树动态生成 IL 等。对于 .NET Core 来说,AOT 相对于 JIT 的优势,除了可以得到更小的程序之外,并不明显。至于 Java/JVM,AOT 技术肯定也是有的,其相对原 JIT 方案,我觉得无论是启动速度还是内存占用上最应该都能有相当大的改善,因为现在的 Java 启动速度和内存占用实在是不忍直视。编辑于 2019-12-26 09:15赞同 769 条评论分享收藏喜欢
【.NET8】nativeAOT初体验——杜绝反编译神器 - 知乎
【.NET8】nativeAOT初体验——杜绝反编译神器 - 知乎切换模式写文章登录/注册【.NET8】nativeAOT初体验——杜绝反编译神器Wesky为别人开路,让更多的人有路可走。前言:VS2022需要更新到17.8.0版本或以上,并且开发环境需要有.NET 8 SDK,可以去微软官方下载。为了效果差异,我先创建一个.net6环境的webapi项目然后创建一个类库项目,并输出一条信息。这个类库项目会被.net 6项目和后面的.net 8项目引用。在.net 6的项目里面引用类库项目,并调用输出。.net 6程序发布以后,并在根目录下运行。发布以后,可以看到,目标文件夹里面有很多被引用的dll文件。而反编译工具基本上也都是根据dll文件来进行反编译的。接着,咱创建一个.net 8的webapi aot程序,记得是带有AOT标记的。该项目只有一个选项——.NET8,说明暂时只有.net8才支持AOT使用这种创建的程序,多了一个http后缀的文件,可以自行研究它的功能。在.net 8程序里面,也引用同一个类库项目,并和上面一样做个输出。对程序进行编译和发布。发布时候需要选择目标平台,例如win-x64,否则可能会报错。当前AOT只支持x64架构。发布以后的目录比较清爽,没有任何dll文件,就一个exe文件,可以避免被人拿dll文件去反编译了。并且双击可执行程序,可以正常运行。针对上面的.net 6程序,为了更好地对比,我也换成同样的win-x64配置环境发布,然后再重新发布,依然可以看见发布以后文件特别多:最后,AOT的另一个功能就是可以不依赖.net框架环境,也可以运行。所以我把它移植到另一台电脑上,另一台电脑并没有安装.net 8环境,双击可执行程序,也可以顺利运行,并且不会提示缺少.net 依赖:有了AOT神器,就不担心被轻松反编译而导致代码泄露了。发布于 2023-11-15 20:54・IP 属地北京Windows 8反编译.NET赞同 1729 条评论分享喜欢收藏申请
教程:使用本机 AOT 发布 ASP.NET Core 应用 | Microsoft Learn
教程:使用本机 AOT 发布 ASP.NET Core 应用 | Microsoft Learn
跳转至主内容
此浏览器不再受支持。
请升级到 Microsoft Edge 以使用最新的功能、安全更新和技术支持。
下载 Microsoft Edge
有关 Internet Explorer 和 Microsoft Edge 的详细信息
目录
退出焦点模式
使用英语阅读
保存
目录
使用英语阅读
保存
打印
电子邮件
目录
教程:使用本机 AOT 发布 ASP.NET Core 应用
项目
11/30/2023
4 个参与者
反馈
本文内容
ASP.NET Core 8.0 引入了对 .NET 本机预先 (AOT) 的支持。
注意
本机 AOT 功能当前为预览版。
在 .NET 8 中,并非所有 ASP.NET Core 功能都与本机 AOT 兼容。
提供了选项卡,可用于查看 .NET Core CLI 和 Visual Studio 说明:
即使选择了 CLI 选项卡,Visual Studio 也是先决条件。
即使选择了 Visual Studio 选项卡,也必须使用 CLI 进行发布。
先决条件
.NET Core CLI
Visual Studio
.NET 8.0 SDK
在 Linux 上,请参阅本机 AOT 部署的先决条件。
安装了“使用 C++ 的桌面开发”工作负载的 Visual Studio 2022 预览版。
说明
Visual Studio 2022 预览版是必需的,因为本机 AOT 需要 link.exe 和 Visual C++ 静态运行时库。 未计划在没有 Visual Studio 的情况下支持本机 AOT。
.NET 8.0 SDK
安装了以下工作负载的 Visual Studio 2022 预览版:
ASP.NET 和 Web 开发
使用 C++ 的桌面开发
使用本机 AOT 创建 Web 应用
创建配置为使用本机 AOT 的 ASP.NET Core API 应用:
.NET Core CLI
Visual Studio
运行以下命令:
dotnet new webapiaot -o MyFirstAotWebApi && cd MyFirstAotWebApi
显示了如下例所示的输出:
The template "ASP.NET Core Web API (Native AOT)" was created successfully.
Processing post-creation actions...
Restoring C:\Code\Demos\MyFirstAotWebApi\MyFirstAotWebApi.csproj:
Determining projects to restore...
Restored C:\Code\Demos\MyFirstAotWebApi\MyFirstAotWebApi.csproj (in 302 ms).
Restore succeeded.
创建新的 ASP.NET Core Web API (Native AOT) 项目。
将项目命名为 MyFirstAotWebApi。
选择“创建”。
发布本机 AOT 应用
验证是否可使用本机 AOT 发布应用:
.NET Core CLI
Visual Studio
dotnet publish
Visual Studio 不支持发布 AOT 应用。 使用 CLI 命令:
dotnet publish
dotnet publish 命令:
编译源文件。
生成已编译的源代码文件。
将生成的程序集传递给本机 IL 编译器。 IL 编译器生成本机可执行文件。 本机可执行文件包含本机计算机代码。
显示了如下例所示的输出:
MSBuild version 17.
Determining projects to restore...
Restored C:\Code\Demos\MyFirstAotWebApi\MyFirstAotWebApi.csproj (in 241 ms).
C:\Code\dotnet\aspnetcore\.dotnet\sdk\8.0.
ntifierInference.targets(287,5): message NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotne
t-support-policy [C:\Code\Demos\MyFirstAotWebApi\MyFirstAotWebApi.csproj]
MyFirstAotWebApi -> C:\Code\Demos\MyFirstAotWebApi\bin\Release\net8.0\win-x64\MyFirstAotWebApi.dll
Generating native code
MyFirstAotWebApi -> C:\Code\Demos\MyFirstAotWebApi\bin\Release\net8.0\win-x64\publish\
输出可能与上述示例不同,具体取决于使用的 .NET 8 版本、使用的目录等因素。
查看输出目录的内容:
dir bin\Release\net8.0\win-x64\publish
显示了如下例所示的输出:
Directory: C:\Code\Demos\MyFirstAotWebApi\bin\Release\net8.0\win-x64\publish
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 30/03/2023 1:41 PM 9480704 MyFirstAotWebApi.exe
-a--- 30/03/2023 1:41 PM 43044864 MyFirstAotWebApi.pdb
可执行文件是自包含的,不需要运行 .NET 运行时。 启动后,它的行为与在开发环境中运行的应用的行为相同。 运行 AOT 应用:
.\bin\Release\net8.0\win-x64\publish\MyFirstAotWebApi.exe
显示了如下例所示的输出:
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: C:\Code\Demos\MyFirstAotWebApi
库和本机 AOT
目前,在 ASP.NET Core 项目中使用的许多常用库在针对本机 AOT 的项目中使用时存在一些兼容性问题,例如:
使用反射来检查和发现类型。
在运行时有条件地加载库。
动态生成代码以实现功能。
需要更新使用这些动态功能的库,才能与本机 AOT 配合使用。 可以使用 Roslyn 源生成器等工具更新它们。
建议希望支持本机 AOT 的库作者执行以下操作:
阅读本机 AOT 兼容性要求。
准备要剪裁的库。
另请参阅
ASP.NET Core 对本机 AOT 的支持
本机 AOT 部署
使用配置绑定器源生成器
最小 API AOT 编译模板
比较 WebApplication.CreateBuilder 与 CreateSlimBuilder
探索新的最小 API 源生成器
将方法调用替换为侦听器
配置绑定源生成器
在 GitHub 上与我们协作
可以在 GitHub 上找到此内容的源,还可以在其中创建和查看问题和拉取请求。 有关详细信息,请参阅参与者指南。
ASP.NET Core
提出文档问题
提供产品反馈
反馈
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.
提交和查看相关反馈
此产品
此页面
查看所有页面反馈
其他资源
加州消费者隐私法案 (CCPA) 禁用图标
你的隐私选择
主题
亮
暗
高对比度
早期版本
博客
参与
隐私
使用条款
商标
© Microsoft 2024
其他资源
本文内容
加州消费者隐私法案 (CCPA) 禁用图标
你的隐私选择
主题
亮
暗
高对比度
早期版本
博客
参与
隐私
使用条款
商标
© Microsoft 2024
JVM三种编译器(Javac \ JIT \ AOT) - 知乎
JVM三种编译器(Javac \ JIT \ AOT) - 知乎切换模式写文章登录/注册JVM三种编译器(Javac \ JIT \ AOT)诗酒这瓜保熟吗?从源代码到机器码,发生了什么?对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?如下图所示,编译器可以分为:前端编译器、JIT 编译器和AOT编译器. 1. 前端编译器:源代码到字节码之前我们说到:对于 Java 虚拟机来说,其实际输入的是字节码文件,而不是 Java 文件。那么对于 Java 语言而言,其实怎么将 Java 代码转化成字节码文件的呢?我们知道在 JDK 的安装目录里有一个 javac 工具,就是它将 Java 代码翻译成字节码,这个工具我们叫做编译器。相对于后面要讲的其他编译器,其因为处于编译的前期,因此又被成为前端编译器。通过 javac 编译器,我们可以很方便地将 java 源文件翻译成字节码文件。就拿我们最熟悉的 Hello World 作为例子:public class Demo{
public static void main(String args[]){
System.out.println("Hello World!");
}
}我们使用 javac 命令编译上面这个类,便会生成一个 Demo.class 文件:> javac Demo.java
> ls
Demo.java Demo.class我们使用纯文本编辑器打开 Demo.class 文件,我们会发现是一连串的 16 进制二进制流。我们运行 javac 命令的过程,其实就是 javac 编译器解析 Java 源代码,并生成字节码文件的过程。说白了,其实就是使用 javac 编译器把 Java 语言规范转化为字节码语言规范。javac 编译器的处理过程可以分为下面四个阶段:第一个阶段:词法、语法分析。在这个阶段,JVM 会对源代码的字符进行一次扫描,最终生成一个抽象的语法树。简单地说,在这个阶段 JVM 会搞懂我们的代码到底想要干嘛。就像我们分析一个句子一样,我们会对句子划分主谓宾,弄清楚这个句子要表达的意思一样。第二个阶段:填充符号表。我们知道类之间是会互相引用的,但在编译阶段,我们无法确定其具体的地址,所以我们会使用一个符号来替代。在这个阶段做的就是类似的事情,即对抽象的类或接口进行符号填充。等到类加载阶段,JVM 会将符号替换成具体的内存地址。第三个阶段:注解处理。我们知道 Java 是支持注解的,因此在这个阶段会对注解进行分析,根据注解的作用将其还原成具体的指令集。第四个阶段:分析与字节码生成。到了这个阶段,JVM 便会根据上面几个阶段分析出来的结果,进行字节码的生成,最终输出为 class 文件。我们一般称 javac 编译器为前端编译器,因为其发生在整个编译的前期。常见的前端编译器有 Sun 的 javac,Eclipse JDT 的增量式编译器(ECJ)。2. JIT 编译器:从字节码到机器码当源代码转化为字节码之后,其实要运行程序,有两种选择。一种是使用 Java 解释器解释执行字节码,另一种则是使用 JIT 编译器将字节码转化为本地机器代码。这两种方式的区别在于,前者启动速度快但运行速度慢,而后者启动速度慢但运行速度快。至于为什么会这样,其原因很简单。因为解释器不需要像 JIT 编译器一样,将所有字节码都转化为机器码,自然就少去了优化的时间。而当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。所以在实际情况中,为了运行速度以及效率,我们通常采用两者相结合的方式进行 Java 代码的编译执行。在 HotSpot 虚拟机内置了两个即时编译器,分别称为 Client Compiler 和Server Compiler。这两种不同的编译器衍生出两种不同的编译模式,我们分别称之为:C1 编译模式,C2 编译模式。注意:现在许多人习惯上将 Client Compiler 称为 C1 编译器,将 Server Compiler 称为 C2 编译器,但在 Oracle 官方文档中将其描述为 compiler mode(编译模式)。所以说 C1 编译器、C2 编译器只是我们自己的习惯性称呼,并不是官方的说法。这点需要特别注意。那么 C1 编译模式和 C2 编译模式有什么区别呢?C1 编译模式会将字节码编译为本地代码,进行简单、可靠的优化,如有必要将加入性能监控的逻辑。而 C2 编译模式,也是将字节码编译为本地代码,但是会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。简单地说 C1 编译模式做的优化相对比较保守,其编译速度相比 C2 较快。而 C2 编译模式会做一些激进的优化,并且会根据性能监控做针对性优化,所以其编译质量相对较好,但是耗时更长。那么到底应该选择 C1 编译模式还是 C2 编译模式呢?实际上对于 HotSpot 虚拟机来说,其一共有三种运行模式可选,分别是:混合模式(Mixed Mode) 。即 C1 和 C2 两种模式混合起来使用,这是默认的运行模式。如果你想单独使用 C1 模式或 C2 模式,使用 -client 或 -server 打开即可。解释模式(Interpreted Mode)。即所有代码都解释执行,使用 -Xint 参数可以打开这个模式。编译模式(Compiled Mode)。 此模式优先采用编译,但是无法编译时也会解释执行,使用 -Xcomp 打开这种模式。在命令行中输入 java -version 可以看到,我机器上的虚拟机使用 Mixed Mode 运行模式。写到这里,我们了解了从 Java 源代码到字节码,再从字节码到机器码的全过程。本来到这里就应该结束了,但在我们 Java 中还有一个 AOT 编译器,它能直接将源代码转化为机器码。3. AOT 编译器:源代码到机器码AOT 编译器的基本思想是:在程序执行前生成 Java 方法的本地代码,以便在程序运行时直接使用本地代码。但是 Java 语言本身的动态特性带来了额外的复杂性,影响了 Java 程序静态编译代码的质量。例如 Java 语言中的动态类加载,因为 AOT 是在程序运行前编译的,所以无法获知这一信息,所以会导致一些问题的产生。类似的问题还有很多,这里就不一一举例了。总的来说,AOT 编译器从编译质量上来看,肯定比不上 JIT 编译器。其存在的目的在于避免 JIT 编译器的运行时性能消耗或内存消耗,或者避免解释程序的早期性能开销。在运行速度上来说,AOT 编译器编译出来的代码比 JIT 编译出来的慢,但是比解释执行的快。而编译时间上,AOT 也是一个始终的速度。所以说,AOT 编译器的存在是 JVM 牺牲质量换取性能的一种策略。就如 JVM 其运行模式中选择 Mixed 混合模式一样,使用 C1 编译模式只进行简单的优化,而 C2 编译模式则进行较为激进的优化。充分利用两种模式的优点,从而达到最优的运行效率。总结在 JVM 中有三个非常重要的编译器,它们分别是:前端编译器、JIT 编译器、AOT 编译器。前端编译器,最常见的就是我们的 javac 编译器,其将 Java 源代码编译为 Java 字节码文件。JIT 即时编译器,最常见的是 HotSpot 虚拟机中的 Client Compiler 和 Server Compiler,其将 Java 字节码编译为本地机器代码。而 AOT 编译器则能将源代码直接编译为本地机器码。这三种编译器的编译速度和编译质量如下:编译速度上,解释执行 > AOT 编译器 > JIT 编译器。编译质量上,JIT 编译器 > AOT 编译器 > 解释执行。而在 JVM 中,通过这几种不同方式的配合,使得 JVM 的编译质量和运行速度达到最优的状态。编辑于 2022-03-05 16:11Java 虚拟机(JVM)Java赞同 173 条评论分享喜欢收藏申请
为什么.NET 团队在支持AOT上这么拉胯? - 知乎
为什么.NET 团队在支持AOT上这么拉胯? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册.NET.NET开发AOT为什么.NET 团队在支持AOT上这么拉胯?最新.NET 6 Preview 6出来了,.NET 团队写的博客下评论有点炸裂,不好的那种。。。 Announcing .NET 6 Preview…显示全部 关注者131被浏览259,449关注问题写回答邀请回答好问题 147 条评论分享18 个回答按时间排序知乎用户微软自己搞出个AOT(伪),那就是Crossgen2。AOT对于桌面端的意义非常重大,希望后端开发同学别总是对AOT表示“CLR够用”和“反对”。桌面端需要的反破解、体积缩小、无依赖、运行快速都需要AOT。希望.Net7上能看到Native AOT的实用性,特别是如果能支持WPF就更好了:[Managed DWrite] Migrate Factory to managed by ThomasGoulet73 · Pull Request #6171 · dotnet/wpf。希望现在就能体验到Native AOT的,可以试试看这个项目,在不加壳的情况下可以达到700k大小,无依赖AOT。它符合我们对真正AOT的期待。编辑于 2022-10-11 14:57赞同 92 条评论分享收藏喜欢收起jean jean 关注有必要, 很重要。 UNITY3D也需要的吧。 十分需要。 商业软件必须要AOT, 哪怕只是AOT DLL也可以,使DLL成NATIVE的, 十分必要, 万分需要。发布于 2022-08-30 09:53赞同 31 条评论分享收藏喜欢 are not allowed to access this resour
.Net Aot之争 - 知乎
.Net Aot之争 - 知乎切换模式写文章登录/注册.Net Aot之争油面筋塞肉随着.net5以及大家对aot的期待以及微软迟早得做点aot的事情,我们来大概看一下aot的状况目前就三样东西1、 .net native,用于uwp, 特别用于uwp,也许winui3还用这个?2、 mono aot, 用于ios ,可能会更广泛的使用3、 corert 针对.net core平台,一直处于试验阶段,可以跑非常简单的.net core, http://asp.net core程序,winform的支持前一阵子看他们在加,主要是COM组件互操作,等这一块做完了,wpf的aot编译也就快了。官方也说了,.net5会包含两个clr,也就是说mono和coreclr都会存在,这么看起来,mono aot和corert似乎都会存在,而corert应该比mono aot更加优秀有潜力,但是mono aot要立马用于ios,所以优先级更高,现在官方态度还不明确。不过我觉得可能性最低的就是官方放弃2和3,唯独1是微软亲手带大的,意味着基于1改名开发一个能用于mono和core的。 而新建一个项目,专门合并2和3也很费劲儿,所以我觉得目前的状况还是分别发展2和3,等将来clr统一了,自然会把他们合并起来再改名。目前也不清楚微软准备为哪些平台的aot提供支持,目前没有特别可靠地消息,所以什么roadmap,社区讨论也是说不清道不明的,无法成为依据,只能说微软自己还在思考。希望corert有没有微软支持都能完成使命,因为他的内容是更多人期待的,http://asp.net core,winform,wpf的aot编译。--新的可以关注的东西https://github.com/dotnet/runtimelab/tree/NativeAOT没用的话:在我的思考逻辑中,这东西是不是社区是不是微软官方的占比并不大,因为这是个很无聊的问题,xamarin收购了算不算官方的? 微软一直对他有不少支持但是还是没有一个官方的样子,后来需要就改名搞个maui,然后里面的一部分算是官方维护,一部分算是社区维护。mono甚至能在linux下跑winform,微软后面有考虑过他的感受么?而有些人就喜欢杠这个是不是社区的。与其讨论这个,不如划分为亲儿子和干儿子来的实在点,mono的东西就一直像干儿子似的,而且这两者是可以转换的。编辑于 2020-08-26 21:49.NET赞同 2128 条评论分享喜欢收藏申请
Attack on Titan (TV Series 2013–2023) - IMDb
ck on Titan (TV Series 2013–2023) - IMDbMenuMoviesRelease CalendarTop 250 MoviesMost Popular MoviesBrowse Movies by GenreTop Box OfficeShowtimes & TicketsMovie NewsIndia Movie SpotlightTV ShowsWhat's on TV & StreamingTop 250 TV ShowsMost Popular TV ShowsBrowse TV Shows by GenreTV NewsWatchWhat to WatchLatest TrailersIMDb OriginalsIMDb PicksIMDb SpotlightIMDb PodcastsAwards & EventsOscarsSXSW Film FestivalWomen's History MonthSTARmeter AwardsAwards CentralFestival CentralAll EventsCelebsBorn TodayMost Popular CelebsCelebrity NewsCommunityHelp CenterContributor ZonePollsFor Industry ProfessionalsLanguageEnglish (United States)LanguageFully supportedEnglish (United States)Partially supportedFrançais (Canada)Français (France)Deutsch (Deutschland)हिंदी (भारत)Italiano (Italia)Português (Brasil)Español (España)Español (México)AllAllTitlesTV EpisodesCelebsCompaniesKeywordsAdvanced SearchWatchlistSign InSign InNew Customer? Create accountENFully supportedEnglish (United States)Partially supportedFrançais (Canada)Français (France)Deutsch (Deutschland)हिंदी (भारत)Italiano (Italia)Português (Brasil)Español (España)Español (México)Use appEpisode guideCast & crewUser reviewsTriviaFAQIMDbProAll topicsAttack on TitanOriginal title: Shingeki no KyojinTV Series2013–2023R-1324mIMDb RATING9.1/10500KYOUR RATINGRatePOPULARITY796Play trailer1:3117 Videos99+ PhotosAnimationActionAdventureAfter his hometown is destroyed and is traumatized, young Eren Jaeger vows to cleanse the earth of the giant humanoid Titans that have brought humanity to the brink of extinction.After his hometown is destroyed and is traumatized, young Eren Jaeger vows to cleanse the earth of the giant humanoid Titans that have brought humanity to the brink of extinction.After his hometown is destroyed and is traumatized, young Eren Jaeger vows to cleanse the earth of the giant humanoid Titans that have brought humanity to the brink of extinction.StarsJessie James GrelleBryce PapenbrookTrina NishimuraSee production info at IMDbProIMDb RATING9.1/10500KYOUR RATINGRatePOPULARITY796Top creditsStarsJessie James GrelleBryce PapenbrookTrina Nishimura2.2KUser reviews64Critic reviewsSee production info at IMDbProTop rated TV #24Awards40 wins & 88 nominationsEpisodes98Browse episodesTopTop-rated4 seasons4321See all10 years2023202220212020201920182017201520142013See allVideos17Clip 1:02Watch 5 Top-Rated Anime Based on MangaClip 1:00Watch 5 Top-Rated TV Pilot Episodes to Stream NowClip 1:00Watch Attack On Titan: The Female Titan Appears!Clip 0:50Watch Attack On Titan: Bring It On Then!Clip 0:25Watch Attack On Titan: Assassin's BulletClip 1:25Watch Attack On Titan: The JaegeristsClip 1:32Watch Attack On Titan: ColossalTrailer 1:31Watch Finale Trailer - Final SeasonTrailer 0:30Watch Season Finale - Official TrailerTrailer 1:26Watch Official Trailer - Final SeasonTrailer 2:05Watch Attack on Titan: Part ITrailer 1:58Watch Attack on Titan: Part IIPhotos7373Top castEditJessie James GrelleArmin Arlert…93 eps • 2013–202393 episodes • 2013–2023Bryce PapenbrookEren Jaeger…85 eps • 2013–202385 episodes • 2013–2023Trina NishimuraMikasa Ackermann…83 eps • 2013–202383 episodes • 2013–2023Yûki KajiEren Yeager82 eps • 2013–202382 episodes • 2013–2023Yui IshikawaMikasa Ackerman82 eps • 2013–202382 episodes • 2013–2023Marina InoueArmin Arlert…82 eps • 2013–202382 episodes • 2013–2023Kishô TaniyamaJean Kirstein68 eps • 2013–202368 episodes • 2013–2023Hiro ShimonoConnie Springer67 eps • 2013–202367 episodes • 2013–2023Clifford ChapinConny Springer…67 eps • 2013–202267 episodes • 2013–2022Mike McFarlandJean Kirschtein…66 eps • 2013–202266 episodes • 2013–2022Romi ParkHange Zoe56 eps • 2013–202356 episodes • 2013–2023Matthew MercerLevi54 eps • 2013–202254 episodes • 2013–2022Jessica CalvelloHange Zoe54 eps • 2013–202254 episodes • 2013–2022Hiroshi KamiyaLevi53 eps • 2013–202353 episodes • 2013–2023Yoshimasa HosoyaReiner Braun49 eps • 2013–202349 episodes • 2013–2023Yû KobayashiSasha Braus47 eps • 2013–202247 episodes • 2013–2022Robert McCollumReiner Braun…47 eps • 2013–202247 episodes • 2013–2022Ashly BurchSasha Braus44 eps • 2013–201944 episodes • 2013–2019All cast & crewProduction, box office & more at IMDbProMore like this8.9Death Note8.6Jujutsu Kaisen9.0Hunter x Hunter8.6Demon Slayer: Kimetsu no Yaiba8.8Vinland Saga8.7Naruto Shippuden9.0One Piece8.4Naruto8.4Chainsaw Man8.7Code Geass: Lelouch of the Rebellion9.0Bleach: Thousand Year Blood War5.0Attack on TitanStorylineEditDid you knowEditTriviaThe manga artist, Hajime Isayama, got the idea for the Titans when he encountered a drunk customer at a coffee shop he worked in. He was inspired by the inability to communicate and realised the most dangerous thing was the human race.QuotesArmin Arlert: Someone who can't sacrifice anything, can't ever change anything.ConnectionsEdited into Attack on Titan Abridged (2013)SoundtracksAttack on Titan: Original SoundtrackComposed by Hiroyuki SawanoUser reviews2.2KReviewReviewFeatured review10/10 Nearly perfectBefore I started watching this show, I couldn't imagine why it is rated so high. After I finished the first season, I understood. And now, having watched the third season I don't understand, why it isn't rated even higher!Truly a masterpiece, and deserves to be mentioned on the same page as other fantasy war epics like Lord of the Rings and Game of Thrones. (I dare to say this is even better than those two.) There are countless twist and turns, shocking revelations and heartbreaking moments troughout the series, spiced with great voice acting, beautiful visuals and on top of all: a more than perfect, stunning soundtrack, thanks to Hiroyuki Sawano.The story is brilliantly written, and does not slow down, not even for a bit. It keeps growing bigger and bigger, while you will find yourself tied to your chair, as you can't watch only one or two episodes. Behind the plot and the action, there is also deeper meaning about war, humanity and questions about moral dilemmas.Toughtprovoking, exciting and most of all a masterpiece of our time!helpful•1K82hencheyDec 17, 2019Top picksSign in to rate and Watchlist for personalized recommendationsSign inTop-Rated "Attack on Titan" EpisodesTop-Rated "Attack on Titan" EpisodesCelebrate the end of an era with a look at the 10 top-rated episodes of "Attack on Titan." Do you agree with your fellow IMDb fans?See the listListFAQ22How many seasons does Attack on Titan have?Powered by Alexawhen do we have season 4?How many episodes will Season 4 part 1 have?WILL THERE BE A PART 2 OF ATTACK ON TITAN SEASON 4 ?DetailsEditRelease dateSeptember 17, 2019 (Philippines)Country of originJapanOfficial sitesFUNimation Productions (United States)Official site (Japan)LanguageJapaneseAlso known asAOTProduction companiesWit StudioProduction I.G.MappaSee more company credits at IMDbProTechnical specsEditRuntime24 minutesColorColorSound mixStereoAspect ratio1.78 : 116:9 HDRelated newsContribute to this pageSuggest an edit or add missing contentIMDb Answers: Help fill gaps in our dataLearn more about contributingEdit pageAdd episodeMore to explorePhotosThe Most Searched Stars on IMDbSee the galleryListIMDb Staff's 2024 Oscar PredictionsSee our predictionsListHillary's 6 Picks for March and BeyondSee the full listRecently viewedYou have no recently viewed pagesGet the IMDb AppSign in for more accessSign in for more accessGet the IMDb AppHelpSite IndexIMDbProBox Office MojoIMDb DeveloperPress RoomAdvertisingJobsConditions of UsePrivacy PolicyYour Ads Privacy ChoicesIMDb, an Amazon company© 1990-2024 by IMDb.com, Inc.Back to top
are not allowed to access this resour.NET AOT编译后能替代C++吗? - 知乎
.NET AOT编译后能替代C++吗? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册.NETC++C#C / C++Modern C++.NET AOT编译后能替代C++吗?近日 .NET 团队发布了 7 preview3版本,AOT性能已经非常之高,而且AOT支持完全静态编译,性能如何?显示全部 关注者67被浏览110,021关注问题写回答邀请回答好问题 21 条评论分享9 个回答默认排序nscript大龄码农/创业狗 关注6月18日更新。(1)开发 NDK 库有人进行尝试:NativeAOT-AndroidHelloJniLib (https://github.com/josephmoresena/NativeAOT-AndroidHelloJniLib) 通过修改 .Net Runtime 来生成 Android 下的 NDK Native 库。希望后续官方能直接支持。(2)Remobjects Elements (https://www.remobjects.com/elements/) 收费工具。可以采用 C# 语言开发 NDK Native 库,限制是不能自由使用 Core CLR,而是使用 Remobjects 的平台相关库 island 和跨平台库 RTL,RTL 库和 Core CLR 的相关类型接口相似。Remobjects Elements 也可以用 C# 开发 wasm 模块,试用了下,满小巧的,gzip 下可以做到低于 1M,性能测试大约是 .net 6 的1/4-1/5。同上面一样,库这块会受到限制。Remobjects Elements 的思路蛮有意思的,可以用 C#[或 Oxygene(Object Pascal), Swift, Java, Go or Mercury (VB)] 来写各种库或应用程序。Swift 语言的免费,其他的收费。可以用这些语言写native 程序、 .net 程序、 jvm 程序 ……----补充一下,这是个很值得探讨的问题,我一直在尝试用 csharp 代替 cpp。很多地方可以直接替代掉,但也遇到了一些问题:(1)写底层算法或库的话,而调用者各种语言都有,csharp的,vb的,java 的,delphi 的都碰到过。那时的工作流程是,csharp 写算法,验证之后,再根据对方需求,改成 cpp。有 AOT 之后,这种情况可以避免掉。(2)移动开发:安卓开发底层的库,参考资料太少。比如,开发个 sdk,给 java 调用,xamarin 资料太少,解决方案也不通用。AOT 工具链完善后,对我来说,可以解决很多问题:(1)写底层库:可以完全放心大胆的用 csharp 写底层库了,jit 模式下快速开发,aot 模式发布。csharp 的生产力比 cpp 高太多,构建系统也比 cmake 好使的多。我现在正在尝试优化 csharp 脚本开发 aot dll 的开发流程,目前还没完全完成,但也挺舒服的,以一个最简单的例子来说明,lib.csx: using System.Runtime.InteropServices;
[UnmanagedCallersOnly(EntryPoint = "add")]
public static int Add(int a, int b)
{
return a + b;
}
[DllImport("pack/out/lib.dll")]
private static extern int add(int a, int b);
int result = add(2,4);
Console.WriteLine(result);
一行命令就编译成 dll 了,win10下是964 k。nscript pack --aot --lib lib.csx再用下面指令调用脚本:nscript .\lib.csx输出:6这种开发模式可比写 cpp 舒服太多了。目前 aot 工具链还不够完善,但是开发起来难度不大,就是工作量的问题。比如,根据代码,直接生成各个语言的调用封装,生成文档 ......这样一来,就可以用 csharp 快速开发出底层库,生成动态链接库、静态链接库给桌面用,给服务器用,给移动设备用。底层库一般不牵扯到ui,其通用性极强。做 android 的 ndk 开发太折腾,cpp 开发,jni 调用,调试麻烦得很。这也可以解决 csharp 这块防止反编译的问题,发布时也可以 UI 层用 jit 跑,底层用 aot 跑来保护代码。(2)开发小工具我造过一个轮子,把 avalonia 的控件库的核心给拆出来,用 direct2d 来绘制,弄了一些基本的控件,写简单的桌面程序,aot 之后尺寸可以控制在 4M,如果写一些小工具还是可以的。再比如说,如果想发布一些 server 端小工具,以 http 方式提供服务,jit 模式下,用 asp.net 来做,单个文件发布压缩之后可以做到20-30M, 用 EmbedIO 来写的话,单个文件发布,win下11M,linux 下 13M。EmbedIO用了反射,aot 我没配好,没跑出来,根据经验的话,aot 应该可以做到 2-4 M。不过,11M 也够用了,来看看用脚本写的代码:#r "nuget: EmbedIO, 3.4.3"
using EmbedIO;
using EmbedIO.WebApi;
using EmbedIO.Actions;
using EmbedIO.Files;
WebServer CreateWebServer(string url)
{
var server = new WebServer(o => o
.WithUrlPrefix(url)
.WithMode(HttpListenerMode.EmbedIO))
.WithLocalSessionManager()
.WithStaticFolder("/static/", "./webroot", true, m => m.WithContentCaching(true)) // Add static files after other modules to avoid conflicts
.WithModule(new ActionModule("/api", HttpVerbs.Get, HandleApi))
.WithModule(new ActionModule("/", HttpVerbs.Any, ctx => ctx.SendDataAsync(new { Message = "Hello!" })))
;
return server;
}
Task HandleApi(IHttpContext ctx)
{
return ctx.SendDataAsync("api");
}
//@main
var url = "http://*:5000/";
var server = CreateWebServer(url);
server.RunAsync();
Console.ReadKey();
所以,工具链完善后,用 csharp 写东西很爽的:(1)写完之后,AOT一下,给各个语言用 <--> 对标 cpp;(2)写完之后,打包个几M 的小东西,扔服务器跑 <--> 是不是很像 golang?(3)不建项目,像我上面那样用脚本写 <--> python;(4)正常使用 <--> java;(5)上 blazor <--> js。除此之外,还有很新东西可以玩的 ......----一些场景替代不了:(1)带 gc 的 .net aot,最小尺寸差不多1M,对于有的场景这个尺寸过大。比如说,对于插件系统,每个插件1M,100个就100M,过大,并且全部加载的话,有100个gc在跑,浪费。不知有没技术让100个插件共享一个 gc。虽然可以不开gc,但这样,就只是个大号的C了。(2)对实时性要求高的场景,因为有gc存在会受到限制。其他场景可以当有 gc 的 cpp 用,应该可以达到 cpp 80%+的性能。其实现在jit,aot以及源生cpp性能都差不了太多,我做过密集计算的测试,细节忘记了,只记得是个 float 密集计算,java 的性能大于csharp和cpp。后来分析,jvm 做了向量化并行处理,csharp和cpp没有做。改csharp代码手动用simd,最后性能略高于Java。aot的除了启动快,还有其他好处:(1)代码很难反编译;(2)尺寸小。假设你要写个东西,给java调用或python调用,用 jit 的话,得几十M,aot 的话,可以做到 1M。这样的话,很多用cpp写的sdk,可以用csharp来写,aot编译成动态链接库,提供给上层用。而不开gc的话,你可以就当他是个C语言的方言。编辑于 2022-06-18 11:58赞同 9030 条评论分享收藏喜欢收起InCerry 关注可以做一些有意思的事情。比如用.NET写的 .NET GC,用.NET写UEFI启动,在大多数场景可以做到和CPP一样方便.但是要求极致性能的场景那还是C C++发布于 2022-07-15 09:31赞同 61 条评论分享收藏喜欢