只要安装了 .net - 我知道 IL 代码只是让 .net 处理不同类型的 CPU。但是当我们考虑 native 代码时——据我所知(如果我错了请纠正我)——代码必须为每种处理器类型独立编译,并且可执行文件开头的“CPU 调度程序”选择哪个将执行代码 - 取决于 确切 类型的 CPU。所以会有一些“最简单”的代码可以在 任何 Intel/AMD CPU 上运行,然后会有一些更优化的代码。
因此我的问题是:.net-native 将创建多少个代码版本,Ngen 将创建多少个版本? Ngen 会只有一个版本,甚至连“最简单”的版本都没有吗?还是它也会有那个——这样如果复制到不同的机器上——它仍然可以工作? .net-native 会不会有很多版本 - 使可执行文件的大小增加几倍?或者大部分代码是相同的,只是针对可优化的内容编写的可优化部分?
编辑
当我提到“处理器类型”时,我不是指 X86 或 ARM。我的意思是:within x86(或 x64)。比如支持MMX、3DNow!、SSE的处理器……
最佳答案
NGEN 和 .NET Native 都为每个架构生成一组代码。它们不会根据用户处理器的型号更改代码生成行为。
在 NGEN 的情况下,这可能会改变。 NGEN 的 future 版本可以检测处理器模型,因为它在最终用户的机器上运行,并为该模型生成最佳代码。
.NET Native 的工作方式类似于 C++。所有代码都是预先生成的,而不是在用户的机器上生成的,因此代码需要在每个支持的处理器模型上运行。 .NET Native 只能在 Win8.1 及以上版本运行。因此,Win8.1 的最低系统要求定义了 .NET Native 可用的处理器功能。对于 x86,Win8+ 要求 SSE2 可用。
关于 MSVCRT 的一个有趣的旁注:
.NET 将 Microsoft Visual C++ 运行时用于许多实用程序函数。 C++ 运行时中的一些函数确实检查处理器特性并为不同的处理器执行不同的代码路径。 (特别是,我知道 x86 memcpy 会执行此操作。)这些检查在运行时发生,并且代码在不同的处理器模型之间保持可移植性。
关于c# - Ngen 和 .net-native 一次为多少种 x86 处理器创建 native 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27125799/