【发布时间】:2010-10-12 17:03:25
【问题描述】:
从运行 .NET 应用程序在 64 位 JIT 与 32 位 JIT 之间切换时,在性能、内存等方面发生了哪些不寻常的、意想不到的后果?我对好的方面感兴趣,但对人们遇到的令人惊讶的坏问题更感兴趣。
我正在编写一个新的 .NET 应用程序,它将同时部署在 32 位和 64 位中。关于移植应用程序的问题有很多问题——我不关心"gotchas" from a programming/porting standpoint。 (即:正确处理本机/COM 互操作、嵌入在结构中的引用类型改变结构的大小等)
但是,this question and it's answer 让我思考 - 我还忽略了哪些其他问题?
有很多问题和博客文章绕开了这个问题,或者触及了它的一个方面,但我还没有看到任何东西可以汇编出一份体面的问题清单。
特别是 - 我的应用程序非常受 CPU 限制,并且具有巨大的内存使用模式(因此首先需要 64 位),并且本质上是图形化的。我担心在 64 位 Windows(使用 .NET 3.5sp1)上运行的 CLR 或 JIT 中可能存在哪些其他隐藏问题。
以下是我目前知道的一些问题:
- (Now I know that) 属性,即使是自动属性,也不会在 x64 中内联。
- 应用程序的内存配置文件发生变化,既是因为size of references,也因为内存分配器具有不同的性能特征
- Startup times can suffer on x64
我想知道人们在 64 位 Windows 上的 JIT 中发现了哪些其他具体问题,以及是否有任何性能变通方法。
谢谢大家!
----编辑-----
只是为了澄清-
我知道尽早进行优化通常是不好的。我知道第二次猜测系统通常是不好的。我也知道 64 位的可移植性有其自身的问题——我们每天在 64 位系统上运行和测试以帮助解决这个问题。等等
但是,我的应用程序不是您的典型业务应用程序。这是一个科学的软件应用程序。我们有许多进程在所有内核(它是高度线程化的)上一次使用 100% 的 CPU 数小时。
我花了很多时间来分析应用程序,这产生了巨大的影响。但是,大多数分析器禁用了 JIT 的许多功能,因此当您在分析器下运行时,可能很难确定内存分配、JIT 内联等小细节。因此我需要这个问题。
【问题讨论】:
-
如果标题提到 .NET 32 位和 64 位运行时,这个帖子会更有用(通过 Google 或 Stacko-search 等很容易找到)。