对于多少种类型的 x86 处理器,Ngen 和 .net 本机一次创建本机代码
For how many types of x86-processors do Ngen and .net-native create native code at once?
只要安装了.net-我知道IL代码只是让.net处理不同类型的CPU。但是当我们考虑本机代码时 - 据我所知(如果我错了,请纠正我) - 代码必须独立地针对每种处理器类型进行编译,可执行文件开头的"CPU 调度程序"选择将执行的代码 - 取决于确切的 CPU 类型。因此,将有一些"最简单的"代码可以在任何Intel/AMD CPU上运行,然后会有一些更优化的代码。
因此,我的问题是:.net-native将创建多少个版本的代码,Ngen将创建多少个版本?Ngen 会只有一个版本,甚至没有"最简单的"版本吗?或者它也会有这个 - 这样如果复制到另一台机器上 - 它仍然可以工作?.net-native 会有很多版本吗 - 使可执行文件的大小是可能的几倍?或者大多数代码是否相同,只有为可以优化的内容编写的可优化部分?
编辑
当我提到"处理器类型"时 - 我的意思不是:X86 或 ARM。我的意思是:在 x86(或 x64)内。如支持MMX,3DNow!,SSE的处理器...
NGEN 和 .NET Native 都会为每个体系结构生成一组代码。它们不会根据用户处理器的模型更改代码生成行为。
在NGEN的情况下,这可能会改变。NGEN 的未来版本可以检测处理器模型,因为它在最终用户的机器上运行,并为该模型生成最佳代码。
.NET Native 的工作方式类似于C++。所有代码都是预先生成的,而不是在用户的计算机上生成的,因此代码需要在每种受支持的处理器型号上运行。.NET Native 只能在 Win8.1 及更高版本上运行。因此,Win8.1 的最低系统要求定义了可用于 .NET 本机的处理器功能。对于 x86,Win8+ 需要 SSE2 可用。
关于MSVCRT的一个有趣的旁注:
.NET 将Microsoft Visual C++ 运行时用于许多实用工具函数。C++运行时中的某些函数会检查处理器功能,并为不同的处理器执行不同的代码路径。(特别是,我知道x86 memcpy可以做到这一点。这些检查在运行时进行,并且代码在不同的处理器型号之间保持可移植性。
简短的回答:正好是一个。
NGen 会将 IL 代码编译为平台的本机代码。您不应该在计算机之间移动 exe 文件,因为它已在 GAC 中为您自己的计算机注册,并链接到其 NGen'd 依赖项。本机映像生成在目标计算机上执行。
至于 .NET 本机,exe 将仅包含一个体系结构的本机代码,就像经典编译器一样。如果您需要支持不同的体系结构,则最终会得到多个exe文件,除非您创建自己的打包机制,但这会破坏.NET本机的目的。
目前,.NET 本机仅在 x64 和 ARM 上受支持。
- 终止调用本机代码的 .Net 线程
- AccessViolationException从托管C (ASP.NET的包装器)调用本机C 代码
- 使用本机C++构建简单的GUI,而无需借助QT或.NET
- 编译为托管的C++代码.NET(C++/CLI),否则作为本机C++
- 从多线程.net应用程序调用的本机dll中的tbb存在问题
- C++/CLI(.NET)等效于将结构写入网络的本机C++
- 视力的NET C#调用C++本机Win32 DLL时出现问题
- .net 本机扩展名 Node.js.
- 为什么我想使用托管(C#和.NET)或本机代码进行Windows API开发
- 对于多少种类型的 x86 处理器,Ngen 和 .net 本机一次创建本机代码
- 从 .NET 程序集透明地访问本机内存
- 为 .NET 使用定义此本机接口的最佳方法是什么?
- 将本机dll或.NET程序集嵌入COM
- 通过.NET中的指针从本机方法返回数据
- 从本机C++调用.NET dll
- 在本机可执行文件中嵌入.net二进制文件
- 在本机进程的.net PE内存负载中
- 将字符串从.net传递到本机(64位)
- 如何正确地将.NET字符串封送为本机代码的std::wstrings
- 在之间传递XML.NET和本机c++