【问题标题】:64-bit Performance Advantages64 位性能优势
【发布时间】:2011-03-21 14:30:49
【问题描述】:

64 位应用程序相对于 32 位应用程序的性能优势的来源是什么?我假设有性能优势,因为像 WinRAR 这样的程序会宣传它。

另外,我们是否可以通过切换到 64 位编译器来获得这些性能优势,或者是否需要对代码进行任何更改?

欢迎提供与非托管和托管代码相关的答案。

【问题讨论】:

    标签: performance 64-bit


    【解决方案1】:

    为了利用最新 CPU 的 64 位架构,您必须:

    • 使用 64 位 CPU 和操作系统
    • 使用 64 位 API 专门为 64 位开发 - 实施必须一直深入到使用 CPU 寄存器(通常用汇编程序编写)的最基本代码,以利用额外的寄存器。
    • 开发一个真正受益于额外寄存器的应用程序 - WinRAR 是一个将充分利用额外寄存器的应用程序,因为它涉及大量复杂算法的微积分。如果您使用非常简单的算法编写应用程序,则它不需要额外的寄存器地址空间,并且在 64 位上运行速度不会更快
    • 还要考虑到,当您使用 CPU 寄存器时,即使您不将整个地址空间用于某个值,它仍会占用尽可能多的空间(= 64 位).. 因此编写一个小应用程序旨在获得优化代码的 64 位将无法正常工作。与在 32 位下开发的应用程序相比,该应用程序将占用两倍的 RAM,并且可能会更慢。对于使用繁重算法或需要分配大量内存(4Gb 是 32 位应用程序的限制)的应用程序,64 位编程很有意义。

    【讨论】:

    • 为什么应用程序会占用两倍的 RAM?关于寄存器空间,您始终可以分别使用 64 位寄存器的高位和低位。因此,明智地使用寄存器自然会解决这个问题。
    • 是的,两倍的空间量基本上是最坏的情况。但即便如此,如果您需要使用远小于 32 位的值(例如在最大 16 位上表示的值),与使用 32 位 CPU 相比,您仍然会浪费一半的寄存器空间。通常,寄存器越大,内存浪费越大。无论如何想象你用汇编程序以外的东西编写代码,你就会受到编译器优化的摆布。在某些情况下,即使是最佳编译器也会使你的代码使用双倍于 32 位架构所需的内存
    • @TripShock.. 阅读此处以获得进一步证明:en.wikipedia.org/wiki/64_bit#Pros_and_cons :)
    • RAM 使用量不会增加两倍,因为大多数整数类型仍然具有相同的大小。只有指针加倍。此外,x86_64 中的寄存器更多,这有时意味着需要更少的内存访问 => 更少的缓存未命中
    【解决方案2】:

    这里有一些很棒的答案。

    如上所述,您可以访问无限的 RAM,这将有助于提高性能如果您需要

    我会谦虚地补充一下如果你不需要它,但无论如何都要使用它,它会损害性能。

    永远不要忽视最古老的科学定律之一:

    大自然厌恶真空

    【讨论】:

    【解决方案3】:

    x64 架构使 x86 架构中可用的通用寄存器数量翻倍,因此编译器能够将更多数据保存在(非常快的)CPU 寄存器中,而不是保存在(相对较慢的)RAM 中。

    【讨论】:

    • 额外的寄存器是巨大的。其他寻址模式可以提供帮助 (RIP)。这些通过简单的重新编译使所有代码受益。 x86 一直因寄存器数量少而受到批评。
    • 实际上是两倍多,因为你有 ESP/RSP 不能作为通用用途,使得 GPR 的数量从 6 到 14(如果你不使用 7 到 15帧指针 EBP)
    【解决方案4】:

    他们什么时候停止在广告中撒谎?我错过了什么? ;-)

    主要的性能优势在于,在 64 位系统中,您可以分配超过 4GB 的 RAM(实际上在大多数系统上超过 2GB)而无需交换。这是一个巨大的速度优势如果你需要它

    因此,如果您的应用程序需要大量 RAM(图像/视频/音频处理、世界/宇宙模拟),那么 64 位将具有优势。

    除此之外,64 位 CPU 还具有对 64 位数据类型进行操作的命令(因此您无需模拟 32 位类型的命令)。这也是一个优势,但它 a)不是那么大,因为您的算法需要使用这些类型而大多数不需要 b)它们仍然比 32 位类型慢(但比仿真快)。

    给你一个想法,这里有一个超级计算机专家的老笑话:“从磁盘加载数据需要一天,然后程序需要五分钟来处理数据,然后我们需要另一天来保存数据结果到磁盘”。从 RAM 读取数据比访问磁盘快 1000 到 1000000 倍。

    总而言之,对于普通用户来说,64 位系统几乎没有优势。

    【讨论】:

    • 您的回答将我的问题的第二部分带到了最前沿...我们是否需要更改代码以针对 64 位进行优化?因为如果使用 64 位数据类型是唯一需要进行的更改,我们实际上不需要为此更改代码,因为 64 位编译器会自动将 int 等类型转换为 64 位(因为它的大小是绑定到字长)。但我也在某处读到过,要获得 64 位的全部优势,需要对代码进行更改......究竟有哪些变化?
    • 大多数代码使用特定的类型大小而不是普通的 int。此外,即使在 64 位系统上,int 通常也是 32 位的,因为如此多的代码取决于它是 32 位的。 long 是另一回事,但有编译器选项可以使其成为 32 位和 long long 64 位。也就是说,使用通常远低于 100000 的 64 位循环计数器有什么优势?
    • 所以我的结论是:如果你有一个特定的问题(比如处理大量数据)并且你有一个可以利用大量类型的算法,那么这很重要。想想用于演示或游戏的花哨的实时图形操作。您的操作系统不会变得更快并且它将需要更多的 RAM(因为每个指针都需要两倍的字节数)。
    • 交换与否完全取决于 RAM 的数量。当您使用的数量超过实际可用时,它会交换。在 32 位上使用超过 4GB 存在问题,但交换不是其中之一。
    • 在 WinRar x64 的情况下,有速度增益!此外,如果您曾经用汇编程序进行过编程,您就会知道有时您需要的寄存器比可用寄存器多,然后您必须使用另一个寄存器或拆分您的算法。拥有更多的寄存器,有时可以提高性能,因为 CPU 可以在一个周期内完成更多的事情。在这里阅读:en.wikipedia.org/wiki/CPU_register
    【解决方案5】:

    我的理解是,在大多数情况下,除了使用更多内存的能力之外,没有性能提升。 (尽管如果您经常使用 64 位数据类型,它可能会提供更高的性能)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2010-09-17
      • 2021-12-19
      • 2011-02-28
      • 2010-10-11
      相关资源
      最近更新 更多