与x86相比,x64性能

时间:2012-04-25 14:35:53

标签: c++ performance windows-7 x86 64-bit

我用c ++编写了这个小程序来检查CPU负载情况。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
int main()
{

    double x = 1;
    int t1 = GetTickCount();
    srand(10000);

    for (unsigned long i = 0; i < 10000000; i++)
    {
        int r = rand();
        double l = sqrt((double)r);
        x *= log(l/3) * pow(x, r);
    }

    int t2 = GetTickCount();
    printf("Time: %d\r\n", t2-t1);
    getchar();
}

我在win7 x64上为x86和x64编译了它 出于某种原因,当我运行x64版本时,它在大约3秒内完成运行 但是当我尝试使用x86版本时,花了48(!!!)秒 我尝试了很多次,总是得到类似的结果 什么可能导致这种差异?

4 个答案:

答案 0 :(得分:13)

使用/Ox(最大优化)查看汇编程序输出,x86和x64构建之间的速度差异是显而易见的:

; cl /Ox /Fa tick.cpp
; x86 Line 17: x *= log(l/3) * pow(x, r)
fld     QWORD PTR _x$[esp+32]
mov     eax, esi
test    esi, esi
; ...

我们看到x87指令正用于此计算。将其与x64版本进行比较:

; cl /Ox /Fa tick.cpp
; x64 Line 17: x *= log(l/3) * pow(x, r)
movapd  xmm1, xmm8
mov     ecx, ebx
movapd  xmm5, xmm0
test    ebx, ebx
; ...

现在我们看到正在使用SSE指令。

您可以通过/arch:SSE2尝试和按摩 Visual Studio 2010来生成类似的说明,但看​​起来64位编译器只会产生更好更快的程序集你的任务。

最后,如果你放松浮点模型,x86和x64几乎完全相同。

时间,不科学的最佳3:

  • x86,/Ox:22704 ticks
  • x64,/Ox:822 ticks
  • x86,/Ox /arch:SSE2:3432 ticks
  • x64,/Ox /favor:INTEL64:1014 ticks
  • x86,/Ox /arch:SSE2 /fp:fast:834 ticks

答案 1 :(得分:5)

原因确实与上证所有关。默认情况下,VS中的64位版本生成SSE2指令,但您必须使用/arch:SSE2开关显式启用32位版本。执行此操作时,您将获得32位和64位版本的可比运行时间。

答案 2 :(得分:3)

这里的许多可能性与x86与x64几乎没有任何关系。一个显而易见的可能性是大多数(所有?)编译器使用SSE作为浮点,其中大多数通常在x86模式下使用8087样式的指令。由于您的代码在浮点上很重,这可能会产生重大影响。

另一种可能性是,在进程或重写x64时,他们注意到/修复了代码生成器中的一些问题,这些问题让它产生了更好的代码,至少在某些情况下是这样。

虽然它看起来不像这里适用,但是一些代码也从64位模式中可用的寄存器大小和/或数量的增加中获益匪浅。

答案 3 :(得分:1)

部分肯定是SSE,但是x64使用SSE模式的一个重要原因是:所有AMD64 CPU都需要SSE2。另一部分也可能是增加的寄存器数