Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 64位可执行文件的运行速度低于32位版本_C_X86_32bit 64bit_X86 64_Linux X32 Abi - Fatal编程技术网

C 64位可执行文件的运行速度低于32位版本

C 64位可执行文件的运行速度低于32位版本,c,x86,32bit-64bit,x86-64,linux-x32-abi,C,X86,32bit 64bit,X86 64,Linux X32 Abi,我有一个64位的Ubuntu 13.04系统。我很想看看32位应用程序在64位系统上如何与64位应用程序进行比较,所以我将下面的C程序编译为32位和64位可执行程序,并记录了它们执行的时间。我使用gcc标志为3种不同的体系结构进行编译: -m32:英特尔80386体系结构(int、long、指针均设置为32 位(ILP32)) -m64:AMD的x86-64体系结构(int 32位;long,指针64位(LP64)) -mx32:AMD的x86-64体系结构(int、long、指针均设置为32

我有一个64位的Ubuntu 13.04系统。我很想看看32位应用程序在64位系统上如何与64位应用程序进行比较,所以我将下面的C程序编译为32位和64位可执行程序,并记录了它们执行的时间。我使用gcc标志为3种不同的体系结构进行编译:

  • -m32
    :英特尔80386体系结构(int、long、指针均设置为32 位(ILP32))
  • -m64
    :AMD的x86-64体系结构(int 32位;long,指针64位(LP64))
  • -mx32
    :AMD的x86-64体系结构(int、long、指针均设置为32位(ILP32),但CPU处于长模式,具有16个64b寄存器,以及 注册呼叫(ABI)
以下是我得到的结果:

ajay@ajay:c$ ./pe16_x32
Did 1000 calls in 89.19 seconds

ajay@ajay:c$ ./pe16_32
Did 1000 calls in 88.82 seconds

ajay@ajay:c$ ./pe16_64
Did 1000 calls in 92.05 seconds
为什么64位版本的运行速度比32位版本慢?我读到64位体系结构改进了指令集,通用寄存器比32位体系结构多了两倍,32位体系结构允许更多优化。在64位系统上,我什么时候可以期望更好的性能

编辑 我使用
-O3
标志打开了优化,现在结果是:

ajay@ajay:c$ ./pe16_x32
Did 1000 calls in 38.07 seconds

ajay@ajay:c$ ./pe16_32
Did 1000 calls in 38.32 seconds

ajay@ajay:c$ ./pe16_64
Did 1000 calls in 38.27 seconds

比较没有优化的代码的性能是毫无意义的。如果您关心性能,您将只使用经过优化的代码

当您启用优化时,您会发现性能差异可以忽略不计。这是意料之中的。您执行的操作都是基于整数的操作,在所有情况下都使用相同大小的数据。由于32位和64位代码在相同的整数硬件单元上运行,因此您应该期望相同的性能

您没有使用任何浮点操作,这是由于不同的浮点硬件单元(x64使用SSE,x86可能使用x87)导致32位和64位代码之间有时存在差异的一个区域


简而言之,结果与预期完全一致。

某些64位数据大于32位数据,这可以减少缓存命中率。您是否尝试过在彼此之后多次运行同一程序?或者尝试使用不同的优化标志?只是注意到您没有使用优化。这是愚蠢的,因为它没有反映性能重要的程序将/应该如何运行。没有优化的基准代码是完全没有意义的。您希望代码运行得快还是不快?我希望此代码的32位和64位性能相同。在所有情况下,操作数的大小都相同,并且没有浮点。
ajay@ajay:c$ ./pe16_x32
Did 1000 calls in 89.19 seconds

ajay@ajay:c$ ./pe16_32
Did 1000 calls in 88.82 seconds

ajay@ajay:c$ ./pe16_64
Did 1000 calls in 92.05 seconds
ajay@ajay:c$ ./pe16_x32
Did 1000 calls in 38.07 seconds

ajay@ajay:c$ ./pe16_32
Did 1000 calls in 38.32 seconds

ajay@ajay:c$ ./pe16_64
Did 1000 calls in 38.27 seconds