我甚至可以用一个小而简单的应用程序看到这个:
#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,BUFFER_LENGTH * sizeof(unsigned char)); }
我建立如下:
$gcc -m32 -std = gnu99 -g -O3 ms.c
和
$gcc -m64 -std = gnu99 -g -O3 ms.c
时间报告的挂钟时间对于-m64构建来说更长,而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
> GCC 4.1.2
> Intel(R)Core(TM)i7-2600K cpu @ 3.40GHz / VirtualBox
(Xeon E5620 @ 2.40GHz / VMWare的差异更大)
解决方法
这真是神秘.我注意到VirtualBox向虚拟机报告SSE 4.1和SSE 4.2指令是不支持的,即使cpu支持它们,并且使用它们的程序在VM中运行正常(!).我没有时间进一步调查这个问题,但你真的应该在一台真正的机器上.不幸的是,我的程序不能运行在32位,所以我无法测试32位模式下的减速.
原文地址:https://www.jb51.cc/linux/395302.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。