【问题标题】:Supplying 64 bit specific versions of your software提供 64 位特定版本的软件
【发布时间】:2010-09-24 08:28:04
【问题描述】:

我是否希望通过将我的原生 C++ 客户端和服务器构建为 64 位代码来获得任何性能提升?

什么样的应用程序可以从 64 位特定版本中受益?

我想任何广泛使用 long 的东西都会受益,或者任何需要大量内存(即超过 2Gb)的应用程序,但我不确定还有什么。

【问题讨论】:

  • 正如其他一些人所暗示的那样,可能很难为此商业案例证明其合理性,但我的问题更多是基于好奇心,而不是当前的业务需求。

标签: performance 64-bit


【解决方案1】:

英特尔 x64 与 x86 的架构优势

  • 更大的地址空间
  • 更丰富的寄存器集
  • 可以链接外部库或加载 64 位插件

x64 模式的架构缺点

  • 所有指针(以及许多指令)占用 2 倍内存,在最坏的情况下将有效处理器缓存大小减半
  • 无法链接到外部库或加载 32 位插件

在我编写的应用程序中,当切换到 64 位时,我有时会看到显着加速 (30%),有时会看到显着减速 (> 2x)。在我受寄存器限制的数字运算/视频处理应用程序中发生了巨大的加速。

在转换为 64 位时,我在自己的代码中看到的唯一大幅减速是来自一个大型指针追踪应用程序,其中一个编译器做了一些非常糟糕的“优化”。另一个编译器生成的代码性能差异可以忽略不计。

现在移植的好处

一旦您知道要注意什么,编写 64 位兼容的代码在 99% 的情况下都不会那么难。大多数情况下,它归结为在引用内存地址时使用 size_t 和 ptrdiff_t 而不是 int (我在这里假设 C/C++ 代码)。将大量未编写为支持 64 位的代码转换可能会很痛苦。

即使为您的应用程序构建 64 位版本没有意义(它可能没有),但值得花时间了解构建所需的内容,以便至少所有新代码并且未来的重构将兼容 64 位。

【讨论】:

  • 一个是 Visual Studio,另一个是 GCC。我真的不记得哪个好哪个坏了。我不得不切换算法就够了。如果您好奇,它是一个马尔可夫随机场 (MRF) 求解器,我从图割算法切换到吉布斯采样。
【解决方案2】:

在努力确定是否存在 64 位构建的技术案例之前,您必须验证是否存在业务案例。您的客户是否要求这样的构建?它会让您在与其他供应商的竞争中获得明确的优势吗?创建这样一个构建的成本是多少?在您的会计、销售和营销流程中添加另一个项目会产生哪些业务成本?

虽然我认识到您需要先了解性能改进的潜力,然后才能掌握竞争优势,但我强烈建议您从全局的角度来解决问题。如果您是一家小型企业或个体企业,您应该对自己进行适当的尽职调查。如果您为更大的组织工作,您的上级会非常感谢您为思考这些问题所付出的努力(或者如果您似乎没有准备好回答这些问题,他们会认为整个问题只是令人讨厌的过度)。

综上所述,我的总体技术响应是,绝大多数面向用户的应用程序不会从 64 位构建中看到任何优势。想一想:当前应用程序中的性能问题有多少来自处理器限制(或 RAM 访问限制)?您当前的应用是否存在性能问题? (如果没有,你可能不应该问这个问题。)

如果它是客户端/服务器应用程序,我敢打赌,网络延迟对客户端性能的贡献要大得多(尤其是当您的查询通常返回大量数据时)。假设这是一个数据库应用程序,您的性能配置文件中有多少是由于服务器上的磁盘延迟时间造成的?如果您考虑影响性能的所有因素,您将更好地了解您的特定应用程序是否会从 64 位升级中受益,如果是,您是否需要同时升级,或者是否所有好处将仅来自服务器端升级。

【讨论】:

    【解决方案3】:

    真的没有太多。尽管在某些情况下,作为程序员,编写 64 位应用程序可能对您有一些好处。一个简单的示例是主要关注与注册表交互的应用程序。作为 32 位进程,您的应用将无法访问 64 位系统上的大量注册表。

    【讨论】:

      【解决方案4】:

      继续 @mdbritt 的评论,如果是服务器构建,或者如果您要分发给 Linux 用户,则构建 64 位 [当前] 更有意义。

      似乎更多的 Windows 工作站仍然是 32 位的,而且新版本可能没有庞大的客户群。

      另一方面,现在许多服务器安装都是 64 位的:RHEL、Windows、SLES 等。为它们构建会中断很多在我看来,潜在的用途。

      桌面 Linux 用户也可能正在运行他们最喜欢的发行版的 64 位版本(很可能是 Ubuntu、SuSE 或 Fedora)。

      不过,构建 64 位的主要明显好处是您可以绕过 3GB 的内存使用障碍。

      【讨论】:

      • 好点,虽然请记住,32 位代码仍然可以在使用 WoW64 的 64 位 Windows 上运行,因此不排除在这些操作系统上安装 32 位软件
      • 在 Windows 上,默认内存限制实际上是 2GB pr 进程,如果您在 .NET 领域工作(我不知道非托管代码),由于框架本身,实际限制约为 1.5GB占用相当多的内存。
      • 好点@Morten ..我没有在问题中看到任何特定于操作系统的信息,所以选择了非特定答案:)
      • 和@John - 如果你在 Linux 上安装 32 位库,你同样可以运行 32 位代码
      【解决方案5】:

      根据this web page,如果您使用大量和/或深度循环,您将从具有 64 位 CPU 的额外通用寄存器中获益最多。

      【讨论】:

        【解决方案6】:

        由于额外的寄存器和新的传递参数约定(实际上与额外的寄存器相关联),您可以获得收益。

        【讨论】:

          猜你喜欢
          • 2011-04-07
          • 2011-07-14
          • 2018-05-09
          • 2017-09-12
          • 1970-01-01
          • 2023-01-04
          • 1970-01-01
          • 2022-01-17
          相关资源
          最近更新 更多