c++ - memcomp - ¿Por qué la versión de lanzamiento de memset es más lenta que la versión de depuración en Visual Studio 2012?
memset char c (1)
Este es un error de referencia estándar, no se mide el tiempo de ejecución de memset () en absoluto. En realidad, mide el tiempo necesario para que el sistema operativo maneje el cuarto de millón de fallas de página que genera su código. Lo cual depende en gran medida de qué otros procesos se estén ejecutando y de cuántas páginas haya preparado el subproceso de cero página del kernel.
En un sistema operativo de memoria virtual de la página de demanda como Windows, malloc () no asigna memoria en absoluto. Asigna espacio de direcciones . Solo números para el procesador. La asignación de memoria física no ocurre hasta que el procesador accede al espacio de direcciones. En ese punto, el núcleo se ve obligado a proporcionar la RAM física para permitir que el procesador continúe. Disparo por una falla de página suave generada por el procesador cuando descubre que una dirección aún no está asignada a la memoria RAM.
Si desea obtener una estimación de cuánto dura realmente memset (), debe llamarlo dos veces. La primera llamada asegura que la RAM está mapeada. Mida la segunda llamada para medir cuánto tiempo lleva la escritura. Que es un número fijo para rangos de memoria grandes como los que está utilizando, la memoria caché y los búferes de escritura no son efectivos, por lo que la velocidad está completamente determinada por el ancho de banda del bus de memoria. Su resultado de depuración sugiere DDR3 sincronizado a 266 MHz, bastante común.
Esto también elimina el sesgo que obtiene al utilizar el asignador de depuración en la compilación de depuración del CRT. Que llena la memoria asignada con un patrón de bits que probablemente provocará un bloqueo cuando intente acceder a la memoria no inicializada. Esto oculta la sobrecarga de la página porque no incluyó el costo de malloc () en la medición.
¿Por qué la versión de lanzamiento de memset es más lenta que la versión de depuración en Visual Studio 2012? en visual sutido 2010, es ese resultado también. Mi computadora:
Intel Core i7-3770 3.40GHz 8G memoria os: windows 7 sp1 64bit
este es mi código de prueba:
#include <boost/progress.hpp>
int main()
{
const int Size = 1000*1024*1024;
char* Data = (char*)malloc(Size);
#ifdef _DEBUG
printf_s("debug/n");
#else
printf_s("release/n");
#endif
boost::progress_timer timer;
memset(Data, 0, Size);
return 0;
}
La salida:
release
0.27 s
debug
0.06 s
editado:
if i change code to this, it will get the same result:
#include <boost/progress.hpp>
int main()
{
const int Size = 1000*1024*1024;
char* Data = (char*)malloc(Size);
memset(Data, 1, Size);
#ifdef _DEBUG
printf_s("debug/n");
#else
printf_s("release/n");
#endif
{
boost::progress_timer timer;
memset(Data, 0, Size);
}
return 0;
}
entonces Hans Passant tiene razón, muchas gracias.