从在 64 位 JIT 和 32 位 JIT 下运行 .NET 应用程序切换时,在性能、内存等方面发生了哪些不寻常的、意想不到的后果?我对好的方面感兴趣,但对人们遇到的令人惊讶的坏问题更感兴趣。
我正在编写一个新的 .NET 应用程序,它将同时部署在 32 位和 64 位上。与移植应用程序有关的问题有很多问题 -从编程/移植的角度来看,我并不关心“陷阱”。(即:正确处理本机/COM 互操作、嵌入在结构中的引用类型改变结构的大小等)
然而,这个问题及其答案让我思考——我忽略了哪些其他问题?
有很多问题和博客文章绕开了这个问题,或者触及了它的一个方面,但我还没有看到任何东西可以汇编出一份体面的问题清单。
特别是 - 我的应用程序非常受 CPU 限制,并且具有巨大的内存使用模式(因此首先需要 64 位),并且本质上是图形化的。我担心在 64 位 Windows(使用 .NET 3.5sp1)上运行的 CLR 或 JIT 中可能存在哪些其他隐藏问题。
以下是我目前知道的几个问题:
- (现在我知道了)属性,即使是自动属性,也不会在 x64 中内联。
- 应用程序的内存配置文件发生变化,既是因为引用的大小,也因为内存分配器具有不同的性能特征
- x64 上的启动时间可能会受到影响
我想知道人们在 64 位 Windows 上的 JIT 中发现了哪些其他具体问题,以及是否有任何性能变通方法。
谢谢你们!
- - 编辑 - - -
只是为了澄清 -
我知道尝试及早优化通常是不好的。我知道第二次猜测系统通常是不好的。我也知道 64 位的可移植性有其自身的问题——我们每天在 64 位系统上运行和测试以帮助解决这个问题。等等
但是,我的应用程序不是您的典型业务应用程序。这是一个科学的软件应用程序。我们有许多进程在所有内核(它是高度线程化的)上一次使用 100% 的 CPU 数小时。
我花了很多时间来分析应用程序,这会产生很大的不同。但是,大多数分析器禁用了 JIT 的许多功能,因此当您在分析器下运行时,可能很难确定内存分配、JIT 内联等小细节。因此我需要这个问题。