标题说明了一切。我希望有人能够向我解释 .NET Native 带来了哪些我们在 Ngen.exe 中还没有的功能。
您可以将 .NET Native 视为桌面 CLR 使用的 NGen 技术的演变。 .NET Native 和 NGEN 有几个主要的区别 -
-
运行时依赖- NGEN 使用完整的桌面 CLR,.NET Native 使用重构的运行时 (mrt100_app.dll),它是应用程序本地的。 .NET Native 运行时经过重构,将大部分功能从应用程序移出并移至代码生成工具链中。这使得它变得更小,游戏付费更高,并且(希望)在运行时更易于调试。 .NET Native 应用程序也是独立的,这对于应用程序来说是一个有用的属性。
-
原生镜像依赖- NGEN 映像与其运行所针对的 CLR 及其依赖程序集的 NGEN 映像紧密绑定。例如,当对 mscorlib.dll 进行错误修复时,这会导致几乎所有 NGEN 映像都需要重新生成。
-
编译地点- .NET Native 的目标是在应用商店中生成本机代码。 NGEN 在最终用户设备上生成本机代码。您当然可以想象,对于某些类别的设备(即手机、平板电脑),您宁愿不浪费最终用户的电池寿命来生成代码。在商店中编译还允许 .NET Native 花费更多时间进行编译,因此允许它应用比 NGEN 所能承受的更多优化。
-
代码生成器- NGEN 使用 JIT 编译器生成代码,.NET Native 使用 Visual C++ 编译器的后端,这使我们能够应用自动向量化等优化,但在 JIT 情况下应用成本太高
-
整个程序分析- NGEN 一次为单个程序集生成代码,这允许在多个应用程序上下文中使用 NGEN 映像。 .NET Native 为整个应用程序包生成代码,这使其能够应用更广泛的优化(例如,完全丢弃运行时从未使用过的代码)。这与重构的框架相结合,使这些优化能够尽可能地发挥作用。
-
IL 后备- NGEN 映像包含程序集的本机代码和 MSIL(以及其他数据结构)。如果运行时发生某些情况导致 CLR 需要在 NGEN 映像中找不到的本机代码,则它可以回退到 JITing。在 .NET Native 当前的开发人员预览中,本机映像中仅存在本机代码。这意味着如果代码不存在于图像中,它将永远不会在运行时执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)