Estoy depurando una aplicación que se está ejecutando bastante más lenta cuando se compila como un ejecutable Linux ELF de 64 bits que como un ejecutable Linux ELF de 32 bits. Utilizando Rational (IBM) Quantify, rastreé gran parte de la diferencia de rendimiento hasta (tambor de arrastre ...) memset
. Curiosamente, memset
toma un lote durante más tiempo en el ejecutable de 64 bits.Problema de rendimiento de Linux de 64 bits con memset
soy incluso capaz de ver esto con una pequeña, sencilla aplicación:
#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));
}
construyo como esto:
$ gcc -m32 -std=gnu99 -g -O3 ms.c
y
$ gcc -m64 -std=gnu99 -g -O3 ms.c
La hora del reloj de pared según lo informado por time
es más largo para la compilación -m64
y Quantify confirma que el tiempo extra se está gastando en memset
.
Hasta ahora he probado en VirtualBox y VMWare (pero no en el Linux básico, me doy cuenta de que necesito hacer eso a continuación). La cantidad de tiempo extra invertido parece variar un poco de un sistema a otro.
¿Qué está pasando aquí? ¿Existe algún problema conocido que mi Google-foo no pueda descubrir?
EDIT: El desmontaje (gcc ... -S
) en mi sistema muestra que memset
se invoca como una función externa:
32 bits:
.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-bit:
.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
Sistema:
- 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
(discrepancia es peor en un Xeon E5620 @ 2.40GHz/VMWare)
¿Qué arquitectura es esta? ¿Qué modelo de procesador? ¿Podemos ver algún desmontaje? – Mysticial
En mi caja ejecutando Ubuntu de 64 bits con gcc 4.4.5, el tiempo de ejecución de las dos compilaciones es indistinguible. – NPE
@Mysticial: agregué algunos detalles del sistema. ¿Cómo sugeriría el desmontaje que incluye 'memset'? Por supuesto 'gcc -S' solo mostrará la llamada a memset. –