与x86相比,x64性能

Ido*_*dov 4 c++ performance 64-bit x86 windows-7

我用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();
}
Run Code Online (Sandbox Code Playgroud)

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

use*_*116 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
; ...
Run Code Online (Sandbox Code Playgroud)

我们看到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
; ...
Run Code Online (Sandbox Code Playgroud)

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

你可以通过/arch:SSE2尝试和按摩 Visual Studio 2010中产生类似的指令,但它出现在64位编译器简单地产生更好更快地组装您手头的任务.

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

时间,不科学最好的3:

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


And*_*rey 5

原因确实与上证所有关.默认情况下,VS中的64位版本生成会生成SSE2指令,但您必须使用/arch:SSE2switch 显式启用32位版本.当您这样做时,您将获得32位和64位版本的可比运行时间.