6

我想知道普通 C++ 应用程序在以下场景中的相对性能:

  1. 构建为 32 位应用程序,在 Intel 64 位处理器 (x64-64) 上运行
  2. 构建为 32 位应用程序,在 Intel 32 位处理器 (x86) 上运行
  3. 构建为 64 位应用程序。

另外,在修改/开发应用程序以使其在 64 位处理器上运行得更快时,我应该考虑哪些因素?

4

7 回答 7

7

简短的回答:您可能不会注意到太大的不同。

更长的答案:64 位 x86 具有更多通用寄存器,这使编译器有更多机会将局部变量优化到寄存器中以更快地访问。编译器还可以假设更现代的功能,例如。不必为 386 优化代码,并且可以假设您的 CPU 具有 SSE 之类的东西,而不是用于浮点数学的旧 x87 FPU。但是指针的宽度会是原来的两倍,这对缓存来说更糟。

于 2009-10-15T07:13:17.087 回答
5

CPU 密集型程序在 64 位上可能会明显更快。处理器有 16 个而不是 8 个可用的通用寄存器,它们的宽度也是两倍(64 位而不是 32 位)。

此外,SSE 指令的寄存器数量从 8 个增加到 16 个,这有助于多媒体应用程序或其他执行大量浮点计算的应用程序。

有关详细信息,请参阅Wikipedia 上的x86-64

还没有提到的一件事是,Windows 和 Linux 等 64 位版本的操作系统对 64 位系统上的函数调用使用不同的调用约定;不是在堆栈上传递参数,而是(最好)在寄存器中传递参数,这原则上更快。所以软件会更快,因为函数调用开销更少。

于 2009-10-15T08:42:13.453 回答
3

性能很可能取决于您的应用程序,并且可能会有很大差异,具体取决于您是否使用针对 64 位环境进行优化的库。如果你想指望加速,你应该专注于改进你的算法,而不是考虑指令集架构。

至于准备/开发 64 位......关键是不要对类型及其各自的大小做出假设。如果您需要具有特定大小的类型,请使用 < stdint.h > 中定义的类型。每当您看到使用size_tptrdiff_t的函数时,您应该使用 typedefs 而不是其他一些类型。

于 2009-10-15T07:11:42.700 回答
1

您对 > 4G 内存有什么要求吗?利用大量内存确实是采用 64 位的重要原因。

于 2009-10-15T12:00:23.503 回答
1

通常,您不会找到仅在支持 64 位操作方面不同的等效处理器,因此很难在 1) 和 2) 之间进行任何具体比较。另一方面,构建 32 位和 64 位模式的区别完全取决于应用程序。64 位版本可能比 32 位版本稍慢或稍快。如果你的应用程序使用了大量的临时变量,那么增加的 64 位模式的寄存器集可以在性能上产生非常大的差异。

于 2009-10-15T07:28:58.953 回答
1

根据经验,我倾向于发现 32 位应用程序的 64 位重新编译通常会使事情快 30%。这是一个粗略的数字,但它适用于我移植到 64 位的许多应用程序。基本上是因为上面解释的原因。你有更多的寄存器,这是天赐之物,并且允许更少的内存交换(这可能会被缓存,从而使胜利变得很小)。某些优化也可以更容易地进行。但是,您确实会遇到较大指针的问题,这确实会消除一些增益,更不用说由于较大的寄存器集而进行上下文切换需要使用更多内存。

但是,在 64 位中进行仔细的手动优化可以提供巨大的性能优势。

您最好的计划是重新编译为 64 位和配置文件。即看看哪个更好。

于 2009-10-15T08:32:14.690 回答
0

你们知道多通道 MC 并发数据总线突发、IMC 和新 x86_64 架构的多核特性吗?至少,如果 64 位,memcpy 可以更快地优化,因为使用 64 位总线和寄存器,而不管并发突发。至少新的架构能够同时将多个内存模块中的数据预取到缓存中。和更多...

于 2009-10-15T08:53:55.403 回答