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

阿杰

我有一个64位的Ubuntu 13.04系统。我很想知道32位应用程序在64位系统上相对于64位应用程序的性能如何,因此我将以下C程序编译为32位和64位可执行文件,并记录了它们执行的时间。我使用gcc标志为3种不同的体系结构进行了编译:

  • -m32:Intel 80386体系结构(int,long,指针全部设置为32位(ILP32))
  • -m64:AMD的x86-64架构(整数32位;长指针64位(LP64))
  • -mx32:AMD的x86-64体系结构(int,long,指针全部设置为32位(ILP32),但是CPU在long模式下具有16个64b寄存器,并且寄存器调用ABI)
// this program solves the
// project euler problem 16.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <sys/time.h>

int sumdigit(int a, int b);

int main(void) {
    int a = 2;
    int b = 10000;
    struct timeval start, finish;
    unsigned int i;
    gettimeofday(&start, NULL);
    for(i = 0; i < 1000; i++)
        (void)sumdigit(a, b);
    gettimeofday(&finish, NULL);
    printf("Did %u calls in %.4g seconds\n", 
            i, 
            finish.tv_sec - start.tv_sec + 1E-6 * (finish.tv_usec - start.tv_usec));
    return 0;
}

int sumdigit(int a, int b) {
    // numlen = number of digit in a^b
    // pcount = power of 'a' after ith iteration
    // dcount = number of digit in a^(pcount)

    int numlen = (int) (b * log10(a)) + 1;
    char *arr = calloc(numlen, sizeof *arr);
    int pcount = 0;
    int dcount = 1;
    arr[numlen - 1] = 1;
    int i, sum, carry;

    while(pcount < b) {
        pcount += 1;

        sum = 0; 
        carry = 0;

        for(i = numlen - 1; i >= numlen - dcount; --i) {
            sum = arr[i] * a + carry;
            carry = sum / 10;
            arr[i] = sum % 10;
        }

        while(carry > 0) {
            dcount += 1;
            sum = arr[numlen - dcount] + carry;
            carry = sum / 10;
            arr[numlen - dcount] = sum % 10;
        } 
    }

    int result = 0;
    for(i = numlen - dcount; i < numlen; ++i)
        result += arr[i];

    free(arr);
    return result;
}

我用来获取不同可执行文件的命令:

gcc -std=c99 -Wall -Wextra -Werror -pedantic -pedantic-errors pe16.c -o pe16_x32 -lm -mx32
gcc -std=c99 -Wall -Wextra -Werror -pedantic -pedantic-errors pe16.c -o pe16_32 -lm -m32
gcc -std=c99 -Wall -Wextra -Werror -pedantic -pedantic-errors pe16.c -o pe16_64 -lm

这是我得到的结果:

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位版本慢?我读到,与32位体系结构相比,64位体系结构改进了指令集,并且通用寄存器增加了两倍,从而可以进行更多优化。什么时候可以在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位代码之间存在差异。

简而言之,结果完全符合预期。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法在64位Ubuntu上运行32位动态可执行文件

来自分类Dev

在64位Debian Jessie上运行32位可执行文件

来自分类Dev

为什么我的64位可执行文件比32位可执行文件大3倍?

来自分类Dev

如何在32位或64位配置中以编程方式运行ANY CPU .NET可执行文件?

来自分类Dev

32位进程不支持Microsoft SharePoint。请确认您运行的是64位可执行文件

来自分类Dev

在32位和64位处理器上运行混合的mpi可执行文件

来自分类Dev

如何在32位或64位配置中以编程方式运行ANY CPU .NET可执行文件?

来自分类Dev

gfortran:在64位系统中编译32位可执行文件

来自分类Dev

在Windows / Linux上使用python3脚本检查可执行文件是32位还是64位

来自分类Dev

在Ubuntu 13.10中运行32位可执行文件

来自分类Dev

Docker容器无法运行使用wget复制的32位iperf可执行文件

来自分类Dev

在Ubuntu 13.10中运行32位可执行文件

来自分类Dev

Docker容器无法运行使用wget复制的32位iperf可执行文件

来自分类Dev

C ++可执行文件无法在Windows 7中运行-64位不兼容

来自分类Dev

无法以32位可执行文件(在64位操作系统上)以编程方式访问EFS文件

来自分类Dev

如果我们可以在64位Windows上运行32位可执行文件,为什么不能转换它?

来自分类Dev

如果我们可以在64位Windows上运行32位可执行文件,为什么不能将其转换?

来自分类Dev

Ubuntu 12.02 32位打印机程序可执行文件无法在Ubuntu 14.04 64位中正常运行

来自分类Dev

为什么64位可移植可执行文件的入口地址只有32位?

来自分类Dev

如何将64位和32位可执行文件绑定为一个?

来自分类Dev

如何安装build-essential:i386以在64位系统上编译32位可执行文件?

来自分类Dev

如何在PowerShell中检查要安装的可执行文件是32位还是64位?

来自分类Dev

没有设置可执行位时,如何从CD运行可执行文件?

来自分类Dev

如何使用mingw-w64编译和链接32位Windows可执行文件

来自分类Dev

在 X86-64 Ubuntu 20.04 上,为什么我的 32 位可执行文件不是?

来自分类Dev

Ubuntu 32或64位版本?

来自分类Dev

32位LINUX 2.6可执行文件可以在LINUX 3.2机器上可靠运行吗?

来自分类Dev

如何将 32 位共享库(.so 文件)链接到 32 位可执行文件?

来自分类Dev

正确的是,适用于64位的android sdk的可执行文件显示了一些有关32位的信息吗?

Related 相关文章

  1. 1

    无法在64位Ubuntu上运行32位动态可执行文件

  2. 2

    在64位Debian Jessie上运行32位可执行文件

  3. 3

    为什么我的64位可执行文件比32位可执行文件大3倍?

  4. 4

    如何在32位或64位配置中以编程方式运行ANY CPU .NET可执行文件?

  5. 5

    32位进程不支持Microsoft SharePoint。请确认您运行的是64位可执行文件

  6. 6

    在32位和64位处理器上运行混合的mpi可执行文件

  7. 7

    如何在32位或64位配置中以编程方式运行ANY CPU .NET可执行文件?

  8. 8

    gfortran:在64位系统中编译32位可执行文件

  9. 9

    在Windows / Linux上使用python3脚本检查可执行文件是32位还是64位

  10. 10

    在Ubuntu 13.10中运行32位可执行文件

  11. 11

    Docker容器无法运行使用wget复制的32位iperf可执行文件

  12. 12

    在Ubuntu 13.10中运行32位可执行文件

  13. 13

    Docker容器无法运行使用wget复制的32位iperf可执行文件

  14. 14

    C ++可执行文件无法在Windows 7中运行-64位不兼容

  15. 15

    无法以32位可执行文件(在64位操作系统上)以编程方式访问EFS文件

  16. 16

    如果我们可以在64位Windows上运行32位可执行文件,为什么不能转换它?

  17. 17

    如果我们可以在64位Windows上运行32位可执行文件,为什么不能将其转换?

  18. 18

    Ubuntu 12.02 32位打印机程序可执行文件无法在Ubuntu 14.04 64位中正常运行

  19. 19

    为什么64位可移植可执行文件的入口地址只有32位?

  20. 20

    如何将64位和32位可执行文件绑定为一个?

  21. 21

    如何安装build-essential:i386以在64位系统上编译32位可执行文件?

  22. 22

    如何在PowerShell中检查要安装的可执行文件是32位还是64位?

  23. 23

    没有设置可执行位时,如何从CD运行可执行文件?

  24. 24

    如何使用mingw-w64编译和链接32位Windows可执行文件

  25. 25

    在 X86-64 Ubuntu 20.04 上,为什么我的 32 位可执行文件不是?

  26. 26

    Ubuntu 32或64位版本?

  27. 27

    32位LINUX 2.6可执行文件可以在LINUX 3.2机器上可靠运行吗?

  28. 28

    如何将 32 位共享库(.so 文件)链接到 32 位可执行文件?

  29. 29

    正确的是,适用于64位的android sdk的可执行文件显示了一些有关32位的信息吗?

热门标签

归档