我可以自信地说,我们编写的99%应用程序不需要处理超过2GB的内存。当然,64位的操作系统可以更好地管理更多的内存,但是一个典型的应用程序被编译成64位是否有任何特定原因呢?
我可以自信地说,我们编写的99%应用程序不需要处理超过2GB的内存。当然,64位的操作系统可以更好地管理更多的内存,但是一个典型的应用程序被编译成64位是否有任何特定原因呢?
64位系统可能会有性能提升。一个很好的例子是函数调用中的一些参数通过寄存器传递(少了在堆栈中需要推送的东西)。
编辑 我查阅了一些我以前学习我们产品在64位版本和32位版本下运行差异时的笔记。我在一台四核64位机器上运行了测试。所以比较起来就好比比较苹果和橙子,因为32位版本显然是在模拟模式下运行的。然而,许多我读到的文章(例如这篇文章)一直说WOW64的速度损失并不显著。但即使这句话不是真的,在一个64位操作系统上几乎肯定会运行您的应用程序。因此,在64位机器上比较32位版本和64位版本具有价值。
在我进行的测试中(当然不是全面的),我没有发现32位版本更快的情况。然而,我运行的许多SQL密集型操作(高CPU和高I/O)在使用64位版本时要快20%到50%。这些测试涉及到一些相当“丑陋”的SQL语句以及一些高并发的TPCC测试。当然,很多东西都取决于编译器开关,所以你需要自己进行测试。
现在就将它们构建为64位,即使您永远不会发布该版本,也可以帮助您找到并修复在以后被迫构建和发布64位版本时可能遇到的问题。
x64有八个额外的通用寄存器,在运行32位代码时不可用。相当于三倍的数量(如果将ESI、EDI、EBP和ESP视为通用寄存器,则为两倍;我不这样认为)。在使用超过四个变量的函数中,这可以节省许多加载和存储操作。
不要低估提供本地64位版本产品的市场价值。
另外,你可能会惊讶于有多少人在开发需要尽可能多内存的应用程序。
如果你需要超过2GB的内存,那么我建议你使用64位编译。但需要注意的是,64位编译意味着64位指针,这意味着代码和数据结构会变得更大,导致应用程序从缓存中受益较少,并且会更频繁地访问虚拟内存等。
因此,如果你不需要它,基本上会使你的应用程序变慢并且更加臃肿,没有必要。
尽管如此,随着时间的推移,你将更关心64位,因为所有工具和库等都将为其编写。即使你的应用程序可以在64K中良好运行,你也不太可能使用16位代码——收益并不重要(它已经是一个小而快速的应用程序),而且肯定会被麻烦所困扰。随着时间的推移,我们也会看到32位的情况类似。
如果您不需要扩展地址空间,以64位模式交付将毫无意义,并且会带来一些缺点,例如增加内存消耗和缓存压力。
虽然我们提供64位版本,但我们的客户已经达到极限,他们正在推动我们减少内存消耗,以便获得这些优势。
所有可能需要大量内存的应用程序:希望在内存中缓存大量数据的数据库服务器,处理大量数据的科学应用程序,...
我最近读了这篇文章,优化C++软件。在第2.3章节“操作系统的选择”中,对64位和32位系统的优缺点进行了比较,并提出了一些关于Windows的具体观察。
Mark Wilkins已经在本主题中指出了函数调用更多寄存器的问题。64位系统的另一个有趣特性是:
SSE2指令集在所有64位CPU和操作系统上都得到支持。
SSE2指令可以提供出色的优化效果,并且它们正在越来越广泛地使用,因此我认为这是一个值得注意的特性。
Fastcall通过将前四个参数保存在寄存器中,使调用子程序更快。