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:
/Ox:22704滴答/Ox:822滴答/Ox /arch:SSE2:3432滴答/Ox /favor:INTEL64:1014滴答/Ox /arch:SSE2 /fp:fast:834滴答原因确实与上证所有关.默认情况下,VS中的64位版本生成会生成SSE2指令,但您必须使用/arch:SSE2switch 显式启用32位版本.当您这样做时,您将获得32位和64位版本的可比运行时间.
| 归档时间: |
|
| 查看次数: |
3857 次 |
| 最近记录: |