WOW64 下的性能和内存消耗

WOW64 下的性能和内存消耗由以下因素决定:

  • 处理器硬件。 指令仿真在芯片上执行。 在 x64 处理器上,x86 指令由处理器本机执行。 因此,x64 上的 WOW64 下执行速度与 32 位 Windows 下的速度相似。 在 Intel Itanium 处理器和任何 ARM64 处理器上,仿真涉及更多软件,因此性能会受到影响。
  • API thunk 开销。 与对 NT 内核的系统调用相比,此开销很小。 NT 内核函数不常调用。
  • 虚拟内存大小。 在 Intel Itanium 处理器上,如果同一 32 位应用程序的两个或多个实例同时运行,WOW64 会增加大量开销。 这是因为 Intel Itanium 上的本机 8 KB 页面,这使得 x86 体系结构上本机 4 KB 页面的仿真复杂化, (更多页面标记为可写;所有可写页面都专用于进程) 。 这会对终端服务在某些处理器上的可伸缩性产生不利影响。 x64 处理器的情况并非如此。
  • 工作集。 WOW64 会增加应用程序的工作集的大小。

WOW64 使 32 位应用程序能够利用 64 位内核。 因此,32 位应用程序可以使用更多内核句柄和窗口句柄。 但是,32 位应用程序可能无法像在基于 x86 的系统上本机运行时那样在 WOW64 下创建尽可能多的线程,因为 WOW64 为每个线程分配额外的 64 位堆栈 (通常为 512 KB) 。 此外,为 WOW64 本身及其使用的数据结构保留一定数量的地址空间。 保留的量取决于处理器;Intel Itanium 上保留的比在 x64 或 ARM64 处理器上保留的更多。

如果应用程序在映像标头中设置了 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志,则每个 32 位应用程序在 WOW64 环境中接收 4 GB 的虚拟地址空间。 如果未设置 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志,则每个 32 位应用程序在 WOW64 环境中接收 2 GB 的虚拟地址空间。