2010-03-10 21 views
8

No soy muy experto en cómo funcionan los procesadores, pero uno podría imaginar que era más fácil configurar trozos de memoria en cero que valores distintos de cero, por lo que puede ser un poco más rápido.¿Es la memoria de relleno con valores distintos de cero más lenta que llenarla de ceros?

+0

¿Cómo planea establecer esos trozos a cero? –

+0

@neil, ermmm memset()? pero estoy abierto a sugerencias. – Mick

+0

Para responder realmente a la pregunta, entonces debería echar un vistazo al código fuente de su versión de memset y al ensamblador que el compilador emite para él. –

Respuesta

8

Creo que la única diferencia sería configurar el registro que tiene el valor para almacenar en la memoria. Algunos procesadores tienen un registro que se fija en cero (por ejemplo, ia64). Aun así, cualquiera que sea la minúscula sobrecarga que pueda haber para establecer un registro será monstruosamente eclipsada por la escritura en la memoria.

En cuanto al tiempo para escribir realmente en la memoria, se sincronizará igual en todas las arquitecturas con las que estoy familiarizado.

1

Si puede hacer eso con la ayuda del sistema de memoria virtual, puede obtener páginas a cero (no asignadas) más rápido que las páginas que no sean cero. Dicha optimización normalmente no se usa en las aplicaciones de C++ (por ejemplo, la implementación de la biblioteca estándar), por lo que no se espera obtener ninguna diferencia entre asignar un std :: vector lleno de cero versus algún otro valor.

1

No tengo ni idea, debido a la cantidad de factores que intervienen, pero la forma de averiguarlo es codificar ambas formas y compararlas.

Vale la pena señalar que la función Windows VirtualAlloc inicializa la memoria recién asignada a cero, aunque el tiempo de ejecución de C++ de depuración de Microsoft lo restablece a valores ficticios para usted posteriormente. Si desea una fuente rápida de memoria inicializada cero, puede valer la pena ir directamente al sistema operativo.

+2

No sé de qué función de asignación de Windows está hablando, pero si se trata de GlobalAlloc, no asigna la memoria de puesta a cero por defecto, aunque puede solicitarse. –

+0

@Neil: VirtualAlloc (MEM_COMMIT) asigna 0 memoria llena. –

+0

¿Estás seguro de lo de la inicialización de Windows? Sería bastante difícil y lento configurar una gran parte de la memoria, ya sea que el programa lo requiera o no, ¿no es así? – Seb

0

sería más rápido si hay una instrucción de CPU para establecer la celda de memoria a cero. pero no hay ninguno.

-1

optimización muy común en la arquitectura Intel, es usar la operación xor a,b donde ambos operandos tienen la misma ubicación de memoria. esto elimina la necesidad de almacenar el valor en el registro y realizar la operación de movimiento. Entonces, si la biblioteca usa esta optimización, escribir ceros es más rápido.

Tengo que corregirme solo, si ambos operandos se registran, entonces se usa XOR.

+3

Ummh, ¿no requeriría una lectura de memoria, seguido de la operación xor, seguido de una escritura de memoria? Eso sería muy lento. – Tronic

+0

@Tronic, creo que tienes razón, leyendo el ensamblaje, parece que solo cuando ambos operandos son registros XMM, entonces usa xor – Anycorn

3

Teóricamente, podría ser más rápido.

En primer lugar, la plataforma de hardware puede ofrecer una (s) instrucción (es) de CPU dedicadas que establece la memoria en cero.

En segundo lugar, el establecimiento de la memoria a cero específicamente podrían ser apoyados por OS/hardware como un perezoso operación , es decir, el acto de la memoria realmente puesta a cero en realidad no hace nada, además de simplemente marcando esta región de memoria para poner a cero en la primera lectura (Por supuesto, algo así solo es posible con regiones de memoria administradas a nivel de SO/hardware).

En efecto, éste es una de las razones existe la función calloc: en algunas plataformas que se puede implementar con bastante más eficacia que una mera malloc seguido de un memset a cero. En tales plataformas, el efecto será tremendamente grande, no "marginal".

+1

+1. Y algunos sistemas operativos mantienen un grupo de páginas cerradas, que pueden cero 'cuando hay tiempo libre'. – tony

2

Puede ser más rápido en PPC si alinea los almacenamientos intermedios, ya que puede usar las instrucciones de caché de dcbz. No es algo con lo que deberías contar porque es más rápido en todos los casos.

Un artículo que menciona esto: http://www.ibm.com/developerworks/power/library/pa-memory/index.html

+0

Gracias por ese enlace. Nunca antes había visto una instrucción específica de caché. –

Cuestiones relacionadas