gpt4 book ai didi

c - memset 的 64 位 Linux 性能问题

转载 作者:IT王子 更新时间:2023-10-28 23:55:39 35 4
gpt4 key购买 nike

我正在调试一个应用程序,当构建为 64 位 Linux ELF 可执行文件时,它的运行速度比构建为 32 位 Linux ELF 可执行文件要慢得多。使用 Rational (IBM) Quantify,我跟踪了很多性能差异(鼓声...)memset。奇怪的是,memset 在 64 位可执行文件中花费的时间要很多

我什至可以通过一个小而简单的应用程序看到这一点:

#include <stdlib.h>
#include <string.h>

#define BUFFER_LENGTH 8000000

int main()
{
unsigned char* buffer = malloc(BUFFER_LENGTH * sizeof(unsigned char));
for(int i = 0; i < 10000; i++)
memset(buffer, 0, BUFFER_LENGTH * sizeof(unsigned char));
}

我是这样 build 的:
$ gcc -m32 -std=gnu99 -g -O3 ms.c

$ gcc -m64 -std=gnu99 -g -O3 ms.c

对于 -m64 构建,time 报告的挂钟时间更长,并且 Quantify 确认在 memset .

到目前为止,我已经在 VirtualBox 和 VMWare 中进行了测试(但没有在裸机 Linux 中进行测试;我意识到接下来我需要这样做)。花费的额外时间似乎因系统而异。

这是怎么回事?是否存在我的 Google-foo 无法发现的众所周知的问题?

编辑: 我系统上的反汇编 (gcc ... -S) 显示 memset 被作为外部函数调用:

32 位:

.LBB2:
.loc 1 14 0
movl $8000000, 8(%esp)
.loc 1 12 0
addl $1, %ebx
.loc 1 14 0
movl $0, 4(%esp)
movl %esi, (%esp)
call memset

64 位:

.LBB2:
.loc 1 14 0
xorl %esi, %esi
movl $8000000, %edx
movq %rbp, %rdi
.LVL1:
.loc 1 12 0
addl $1, %ebx
.loc 1 14 0
call memset

系统:

  • CentOS 5.7 2.6.18-274.17.1.el5 x86_64
  • 海湾合作委员会 4.1.2
  • 英特尔(R) 酷睿(TM) i7-2600K CPU @ 3.40GHz/VirtualBox
    (Xeon E5620 @ 2.40GHz/VMWare 上的差异更严重)

最佳答案

我认为虚拟化是罪魁祸首:我一直在自己运行一些基准测试(批量生成随机数,顺序搜索;也是 64 位),发现代码在 VirtualBox 中的 Linux 中运行速度比 VirtualBox 慢 ~2 倍 native 在Windows下。有趣的是,该代码不执行 I/O(除了偶尔的简单 printf, 时间之间)并且使用很少的内存(所有数据都适合 L1 缓存),所以有人会认为你可以排除页表管理和 TLB 开销。

这确实很神秘。我注意到 VirtualBox 向 VM 报告不支持 SSE 4.1 和 SSE 4.2 指令,即使 CPU 支持它们,并且使用它们的程序在 VM 中运行良好(!)。我没有时间进一步调查这个问题,但你真的应该在真机上计时。不幸的是,我的程序不能在 32 位上运行,所以我无法测试 32 位模式下的减速。

关于c - memset 的 64 位 Linux 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8968570/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com