我想知道以下场景中普通C ++应用程序的相对性能:
此外,在修改/开发应用程序以使其在64位处理器上运行得更快时,我应该考虑哪些因素?
答案 0 :(得分:7)
简短的回答:你可能不会发现太大的差异。
更长的答案:64位x86具有更多通用寄存器,这使编译器有更多机会将局部变量优化为寄存器以便更快地访问。编译器还可以采用更多现代功能,例如。不必为386优化代码,并且可以假设您的CPU具有SSE而不是旧的x87 FPU用于浮点数学。但指针的宽度是宽度的两倍,这对缓存来说更糟糕。
答案 1 :(得分:5)
在64位上,CPU密集型程序可能会明显加快。处理器有16个而不是8个通用寄存器,它们也是两倍宽(64而不是32位)。
SSE指令的寄存器数量也从8增加到16,这有助于多媒体应用程序或其他进行大量浮点计算的应用程序。
有关详情,请参阅维基百科上的x86-64。
尚未提及的一件事是64位版本的操作系统(如Windows和Linux)在64位系统上使用不同的calling convention进行函数调用;而不是在堆栈上传递参数,参数(优选地)在寄存器中传递,原则上更快。所以软件会更快,因为函数调用开销较少。
答案 2 :(得分:3)
性能很可能取决于您的应用程序,并且可能会有很大差异,具体取决于您是否使用对64位环境进行优化的库。如果你想依靠加速,你应该专注于改进你的算法,而不是考虑指令集架构。
至于准备/开发64位......关键是不要对类型及其各自的大小做出假设。如果您需要具有特定尺寸的类型,请使用< stdint.h>中定义的类型。每当您看到使用 size_t 或 ptrdiff_t 的函数时,您应该使用typedef而不是其他类型。
答案 3 :(得分:1)
一般情况下,您找不到仅仅支持64位操作的等效处理器,因此很难在1)和2)之间进行任何具体的比较。另一方面,构建32位和64位模式之间的差异完全取决于应用程序。 64位版本可能比32位版本略慢或略快。如果您的应用程序使用了大量临时变量,那么增加的64位模式寄存器集可以在性能上产生很大的差异。
答案 4 :(得分:1)
根据经验,我倾向于发现32位应用程序的64位重新编译通常会使事情快30%。它是一个粗略的数字,但它适用于我已移植到64位的许多应用程序。基本上它的原因如上所述。你有更多的寄存器,这是一个天赐之物,并允许更少的内存交换(这可能会被缓存,无论如何使得胜利非常小)。某些优化也可以更容易地进行。但是,你确实遇到了更大指针的问题,它会消除一些增益,更不用说由于寄存器设置较大,进行上下文切换需要使用更多内存。
64位的精心优化可以提供巨大的性能优势。
您最好的计划是重新编译为64位和配置文件。即看哪个更好。
答案 5 :(得分:1)
您对>有任何要求吗?内存4G?利用内存空间真的是64位的重要原因。
答案 6 :(得分:0)
您是否了解多通道MC并发数据总线突发,IMC以及新x86_64架构的多核功能?至少,如果64位因为使用64位总线和寄存器而不管并发突发,可以更快地优化memcpy。至少新的arch能够同时从多个内存模块预取数据到缓存中。还有更多...